C++编译器何时推断 no,除了方法?
When does a C++ compiler infer noexcept for a method?
我只是注意到我的一个std::vector<Foo>
在调整大小时正在复制而不是移动其元素 - 即使Foo
有一个移动 ctor:
class Foo {
// ...
Foo(Foo&& other) : id_(other.id_), ptr_(other.ptr_), flag(other.flag)
{
other.flag = false;
};
// ...
int id_;
void* ptr_;
bool flag;
}
然后我读到:
在 std::vector 上调整大小不会调用移动构造函数
这提醒了我,只有当元素的移动 ctor 被声明为noexcept
时,std::vector
才会使用移动构造。当我添加noexcept
时,移动ctor被调用。
我的问题是:为什么给定移动 ctor 的代码,编译器不确定它是noexcept
的?我的意思是,它可以知道一个事实,即不能抛出异常。另外,标准是否不允许推断noexcept
,或者不仅仅是由我的特定编译器完成的?
我在GNU/Linux上使用GCC 5.4.0。
tl;dr:不允许编译器推断noexcept
为什么,给定移动 ctor 的代码,编译器不确定它是 noexexcept ?
因为 noexcept 规范是根据声明确定的 - 而不是定义。这类似于 const 规范的工作方式。不允许编译器将函数确定为 const,即使其实现不修改任何成员。
是推断 否,除非标准不允许
据我了解,是的:
[规格除外] ...中缺少异常规范 除析构函数 (12.4( 或释放函数 (3.7.4.2( 的函数声明符之外的函数声明符表示 异常规范,即所有类型的集合。
推断所有类型的集合以外的内容将与此规则相矛盾。当然,当编译器可以证明不能抛出异常时,它可以在 as-if 规则下优化任何堆栈展开代码,但这种优化不会影响 SFINAE 自省。
已经有关于引入noexcept(auto)
的可能性的讨论,这将是让编译器推断noexcept 规范的明确方法。
相关文章:
- 为不同配置设置MSVC_RUNTIME_LIBRARY的正确方法是什么
- 通过方法访问结构
- 最小硬币更换问题(自上而下方法)
- C++为构建时间获取QDateTime的可靠方法
- "error: no matching function for call to"构造函数错误
- 在C#中处理C++指针而不使用unsafe的最佳方法
- 处理多个异常集合的C++方法
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- 有什么方法可以遍历结构吗
- 当类在C++中定义时,有什么方法可以"register"类吗?
- 在C++中,将大的无符号浮点数四舍五入为整数的最佳方法是什么
- 实现无开销push_back的最佳方法是什么
- 使用std::函数映射对象方法
- 调用专用模板时出错"no matching function for call to [...]"
- 如果子类中没有构造函数方法,则错误"no matching function for call to 'LGame::LGame(String&)'"
- C++编译器何时推断 no,除了方法?
- 如何修复空虚拟方法的"warning: no return statement in function returning non-void [-Wreturn-type]"
- 我应该声明一个方法 no除非它在正确使用时永远不会抛出
- 这是求no. 5最大值的更好方法
- c++ CoCreateInstance 方法返回"No Such Interface supported"