Consinder下面的例子:可以自動演繹添加隱式常量?
#include <iostream>
#include <string>
struct foo { std::string value; };
inline foo bar() { return { "42" }; }
std::string my_func() {
auto &x = bar();
^^^^^^^^^^^^^^^^
return x.value;
}
int main() {
std::cout << my_func() << std::endl;
}
編譯它既GCC和CLANG EMIT,最有可能理所當然,同樣的錯誤:
error: invalid initialization of non-const reference of type 'foo&' from an rvalue of type 'foo'
然而,令我驚訝的是編譯和運行在VC罰款+ +2015。
- 這是VC++ 2015的bug嗎?
- 該標準是否規定
auto
可以在語句呈現程序不合格時向對象添加隱式const
?
「CV-限定符('const'和'volatile')不會自動從'auto'推導出來。」不完全的。 'const int c = 1; auto&d = c;/*確定,d是const int&* /'它不會讓人想起cv-qualifiers,但是如果初始化器符合cv標準,那麼推斷它就非常令人高興 –
To @ T.C。我會補充說,它甚至可以用右值:'auto&d = std :: move(c)'將會編譯。但是你沒有看到那些常量合格的rvalues。 – Brian
你在做什麼?我目前與GNU/Linux一起工作,私下裏有一臺Mac,但我*擁有*來防禦「Redmond」,因爲編譯器可以自由地接受不規範的代碼作爲擴展(除了可能需要警告外,正如前面提到的那樣)。這個特定的擴展是否值得是另一個話題。例如,GCC開發者事實上一直很樂意爲其他編譯器團隊提供擴展 - 記得C++簽名?沒有我知道的「純粹的標準C++」編譯器,甚至沒有默認情況下。 –