C++编译器是否允许用一个构造来代替construct+moveconstruct
Are C++ compilers allowed to replace construct + moveconstruct with just a construct?
是否允许C++编译器替换:
const auto myType = MyType(1, 2, 3);
带有:
const MyType myType(1, 2, 3);
即发出任务,或者有什么东西可以阻止这种情况发生?
注意:我问的原因是我更喜欢第一个版本
是的,允许实现省略类的复制/移动构造当满足某些条件时,它被称为复制省略。
在以下情况下,编译器可以省略类对象的复制和移动构造函数,即使是复制/移动构造函数和析构函数有明显的副作用。
对于您的代码,
如果函数通过值返回类类型,并且返回语句的表达式是非易失性对象的名称自动存储持续时间,不是函数参数,或者catch子句参数,并且具有相同类型(忽略顶级cv资格)作为函数的返回类型,然后复制/移动被省略。当构造该局部对象时直接在函数返回值所在的存储中构造否则将被移动或复制到。复制省略的此变体为称为NRVO,"命名返回值优化"。
请注意,复制/移动ctor仍然需要可访问。
即使发生了复制省略,并且没有调用复制/移动构造函数,它也必须存在并可访问(就好像根本没有发生优化一样),否则程序就不正确了。
相关文章:
- std::allocator_traits::construct调用了错误的构造函数
- 将赋值运算符实现为"destroy + construct"是否合法?
- Construct unordered_map with a value_type of unique_ptr
- 为什么 std::optional 不允许"move construct and copy assign only"类型的移动分配?
- ASIO UDP:类 std::分配器<void>没有名为"construct"的成员
- C++编译器是否允许用一个构造来代替construct+moveconstruct
- gcc 未给出的 Clang 错误"attempted to construct a reference element in a tuple with an rvalue"
- 错误:对BSTLink::construct(BST*、BST*和BST*)的调用没有匹配的函数
- 应该分配器 construct() 默认初始化而不是值初始化
- C++对原始STL实现中"construct"方法逻辑的理解
- boost:spirit::qi 解析器使用多种语法和 phoenix::construct
- Clang 输出错误"no matching construct for initialization"
- 如果对象是可构造/可析构的,STL容器是否允许跳过调用allocator::construct和allocator::d
- 使用emplace代替之前的construct object
- construct ip::address from ipv4_address
- Construct Eigen::Transform from Eigen::Translation
- "construct on first use"成语在任何情况下都能失败吗?
- 为什么有两个std::allocator::construct函数?
- "Must construct a QApplication before a QWidget"
- Tizen Construct() Button 方法失败