C++17编译器(gcc或Microsoft Visual C++)是否有禁止该功能的选项"not produce a temporary"



在以下情况下,如何告诉С++17编译器创建临时(即,C++17编译器必须考虑复制/移动操作,就像C++11和C++14编译器一样(

class A{
public:
A(){}
A(const A&)=delete;
A(A&&)=delete;
};
A f(){
return A();
}
int main(){
auto a=f();
}

输出(c++14-这就是我想要的(:

gcc -std=c++14 ./a.cpp
./a.cpp: In function ‘A f()’:
./a.cpp:8:11: error: use of deleted function ‘A::A(A&&)’
return A();
^
./a.cpp:5:3: note: declared here
A(A&&)=delete;
^
./a.cpp: In function ‘int main()’:
./a.cpp:11:11: error: use of deleted function ‘A::A(A&&)’
auto a=f();
^
./a.cpp:5:3: note: declared here
A(A&&)=delete;
^

输出(c++17(:

gcc -std=c++17 ./a.cpp
./a.out
(successfully run)

我的客户有大量的C++11代码和C++17编译器:gcc 8.3.0和Microsoft C++编译器(来自Visual Studio 2017和2019(。还有许多地方包含上面的代码。C++17编译器是否有一个选项;不产生临时的";在这种情况下?

您不能(也不应该(停用保证省略。然而,如果你想在特定情况下防止它,你所需要做的就是不要使用prvalue:

A f(){
A a{};
return a;
}

这将要求A可以被移动,尽管移动仍然可以(几乎肯定会(被忽略。

保证省略的一个要点是,您现在可以返回不可移动类型的prvalue。这允许您通过工厂函数进行更复杂的初始化。这不是希望在全局范围内阻止的事情。

最新更新