这个 MWE 可能看起来做作,但失败的 static_assert 仍然令人惊讶:
#include <utility>
struct C {
void f() noexcept { }
using F = void(C::*)();
static constexpr F handler() noexcept {
return &C::f;
}
void g() noexcept(noexcept((this->*handler())())) {
}
};
int main() {
static_assert(noexcept(std::declval<C>().g()));
}
魔杖链接:https://wandbox.org/permlink/a8HSyfuyX1buGrbZ
我希望这适用于 Clang 但不适用于 GCC,因为它们在运算符 noexcept 的上下文中对“this”的处理方式不同。
最佳答案
鉴于您的 static_assert
没有字符串参数,您使用的是 C++17。在 C++17 中,noexcept
成为类型系统的一部分。这意味着给定:
using F = void(C::*)();
这个 PMF 不是noexcept
。调用它相当于调用一个noexcept(false)
成员函数。您需要将函数类型标记为noexcept
:
using F = void(C::*)() noexcept;
该更改允许您的代码编译:
#include <utility>
struct C {
void f() noexcept { }
using F = void(C::*)() noexcept;
static constexpr F handler() noexcept {
return &C::f;
}
void g() noexcept(noexcept((this->*handler())())) {
}
};
int main() {
static_assert(noexcept(std::declval<C>().g()));
}
关于c++ - noexcept 运算符在调用指向成员函数的指针后失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46719806/