1

在以下情况下,我如何告诉 С++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 编译器是否有一个选项可以在这种情况下禁止“不产生临时”功能?

4

1 回答 1

3

您不能(也不应该)停用保证省略。但是,如果您想在特定情况下阻止它,您需要做的就是不使用纯右值:

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

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

保证省略的要点之一是您现在可以返回不可移动类型的纯右值。这允许您通过工厂函数进行更复杂的初始化。这不是您应该在全球范围内阻止的事情

于 2021-05-18T13:28:35.730 回答