1

为什么这会在 MS Visual C++ 上编译?

struct myClass{};

void func(myClass& arg){}

void main() {
   func( myClass() );  // works even though func only takes myClass& 
}                      // (not const myClass&!!)

这是否也适用于其他编译器,或者这个 MSVC 特定(甚至是编译器错误?)。我什至可以像这样得到这个右值的参考:

void func(myClass* arg){}

int main() {
    func( &myClass() ); 
}

这仅适用于使用构造函数临时创建的对象。例如,这不适用于 (myClass() + myClass()) 之类的任何其他右值。

4

2 回答 2

9

它可以编译是因为 MSVC 有一个不符合标准的“扩展”,它允许将非常量引用绑定到临时对象。

第一个示例不应在符合标准的编译器上编译。

在第二个示例中,您使用临时地址来设置指针的值。这也应该导致错误。

Clang 3.2 产生:

错误:获取“Foo”类型的临时对象的地址 [-Waddress-of-temporary]

而 GCC 4.7.3 产生

错误:获取临时地址 [-fpermissive]

于 2013-05-15T16:46:49.947 回答
0

具有默认项目设置(现在包括/permissive-标志)的 MSVC 2017 会产生错误

错误 C2664:“void func(myClass &)”:无法将参数 1 从“myClass”转换为“myClass &”
注意:非常量引用只能绑定到左值

即使/permissive-选项由于某种原因不可行,使用/W4也会产生警告:

警告 C4239:使用了非标准扩展:'argument':从 'myClass' 转换为 'myClass &'
注意:非 const 引用只能绑定到左值

于 2019-03-17T12:21:03.640 回答