为什么要在MS Visual C++上编译?
struct myClass{};
void func(myClass& arg){}
void main() {
func( myClass() ); // works even though func only takes myClass&
} // (not const myClass&!!)
Run Code Online (Sandbox Code Playgroud)
这是否也适用于其他编译器,或者是否特定于MSVC(甚至是编译器错误?).我甚至可以像这样得到这个右值的引用:
void func(myClass* arg){}
int main() {
func( &myClass() );
}
Run Code Online (Sandbox Code Playgroud)
这仅适用于使用构造函数临时创建的对象.这不适用于任何其他rvalue,例如(myClass()+ myClass()).
它编译是因为MSVC具有非标准兼容的"扩展",允许将非const引用绑定到临时对象.
第一个示例不应在符合标准的编译器上编译.
在第二个示例中,您将获取临时的地址以设置指针的值.这也应该导致错误.
Clang 3.2产生:
错误:获取'Foo'类型的临时对象的地址[-Waddress-of-temporary]
而GCC 4.7.3产生
错误:获取临时[-fpermissive]的地址