我快速浏览了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