5

我正在尝试编译以下代码,clang++ -std=c++11 -c但它失败了:

void g() noexcept {}

template <typename Func>
void f(Func && func) noexcept(noexcept(func()))
{ static_assert(noexcept(func()), "func()"); } // No error!

void h() { f(&g); } // No error!

static_assert(noexcept(f(&g)), "Error!");

Clang 3.4.2 给我的错误消息是:

test.h:9:1: error: static_assert failed "Error!"
static_assert(noexcept(f(&g)), "Error!");
^             ~~~~~~~~~~~~~~~

我在这里想念什么?

4

1 回答 1

2

noexcept不是函数类型的一部分。

因此,&g这只是 type 的普通表达式void(*)(),没有特殊的noexcept权力。也是g,因为它衰减到函数指针。当这样一个函数指针最终被调用时,它没有noexcept规范,因此整个表达式不是noexcept.

于 2014-08-19T14:49:30.687 回答