C ++ 17-将右值引用绑定到非常量左值引用

时间:2018-12-06 12:29:46

标签: c++ c++17

我快速浏览了C ++ 17标准,但是当在Clang和GCC中同时使用-std=c++17时,我不太清楚下面的代码是如何编译的。

但是,如果没有设置-std=c++17,它就不会编译,正如我所期望的那样。

我的看法是,代码调用了Test的副本构造函数,该复制构造函数使用第21行上的右值引用将非常量左值引用作为参数。这将尝试将右值引用绑定到左值引用(据我所知)是不允许的。

#include<iostream> 

class Test 
{ 
public: 
   Test()        { std::cout << "Test()\n";  } 
   // Copy constructor with non-const parameter
   Test(Test &t) { std::cout << "Test(Test&)\n"; } 
}; 

Test fun() 
{ 
    std::cout << "fun() called\n"; 
    Test t; 
    return t; 
} 

int main() 
{ 
    Test t1; 
    Test t2 = fun(); 
    return 0; 
} 

在C ++ 17上发生了什么变化,使该程序得以成功编译?

在Clang和GCC(最新版本)上都在Compiler Explorer上进行了测试: godbolt

非c ++ 17版本(未编译)的链接: godbolt

0 个答案:

没有答案