【发布时间】:2016-12-10 04:33:26
【问题描述】:
研究“noexcept 说明符(和运算符)”,我写了一个简单的代码。我很惊讶这段代码:
void asdf() noexcept {}
int main()
{
auto f = asdf;
std::cout << std::boolalpha << noexcept(f()) << std::endl;
}
打印false,甚至函数“asdf”也没有指定。
所以在寻找为什么会发生这种神秘现象的过程中,我发现了 C++17 的“异常说明符类型系统”——P0012R1。
根据这个(接受的)提案,从 C++17 开始;因为noexcept是函数类型的一部分,上面的代码会打印true吗?
还有一个,在this问题的一行:
std::function<void() noexcept> f
noexcept 指定在 C++14 或 11 中似乎被忽略了。
这段代码会在 C++17 中按预期工作吗?
【问题讨论】:
-
g++ return
truefornoexcept(f())without-std=c++1z(但 clang 确实返回false)。 -
为了获得更多乐趣,请将
auto f = asdf;更改为void(*f)() noexcept = asdf;。现在 GCC 打印false而 clang 打印true。 -
@Holt 感谢您提供信息。我正在使用 MSVC(返回
false)。他们会有什么不同?这是 g++ 或 C++14 或更早标准的错误,没有指定noexcept类型系统? -
@hvd 对于该代码,MSVC 打印
true。我现在很困惑:p -
@hvd 使用函数指针版本,如果你去掉
asdf上的noexcept,clang会拒绝做作但gcc不会抱怨...我猜gcc忽略noexcept函数指针声明。
标签: c++ c++11 c++14 c++17 noexcept