【发布时间】:2012-02-07 16:41:15
【问题描述】:
我最近开始添加新的noexcept 规范以尽可能移动构造函数/赋值。现在我开始想知道隐式生成的成员函数的异常规范是什么样的。由于拥有noexcept 移动函数允许使用更有效的代码路径(例如,在调整vector 的大小时)我希望尽可能将它们声明为noexcept。我无法理解标准对此的规定,因此尝试了 g++4.6 中的以下代码(使用-std=c++0x)来掌握它:
struct foobar{};
int main()
{
foobar a, b;
std::cout<<std::boolalpha
<<noexcept(foobar())<<", "<<noexcept(foobar(a))<<", "
<<noexcept(a = b) <<", "<<noexcept(a = std::move(b))<<", "
<<noexcept(foobar(std::move(a)))<<std::endl;
}
这给了我True, True, True, False, False 的输出,这意味着noexcept 的默认和复制构造函数/赋值,而不是移动操作。
现在回答我的问题:
在什么情况下隐式生成(或默认)的成员函数声明为noexcept?此外,foobar 观察到的行为是正确的还是只是 gcc4.6 中的编译器错误?
【问题讨论】:
标签: c++ c++11 language-lawyer