C++17 编译器gcc 或 Microsoft Visual C++,是否有选项禁止“不产生临时”功能

如何解决C++17 编译器gcc 或 Microsoft Visual C++,是否有选项禁止“不产生临时”功能

我如何告诉 С++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编译器,有没有在这种情况下禁止“不产生临时”特性的选项?

解决方法

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

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

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?