[英]noexcept operator fails after calling pointer-to-member function
这个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()));
}
Wandbox链接: 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()));
}
f
是noexcept
,但指向它的指针不是。 因此,在定义g
, this->*handler()
返回一个PMF这是不noexcept
(即使你碰巧返回是 MF的地址noexcept
,所以当你调用写(this->*handler())()
然后你调用的函数不是noexcept
,所以noexcept
子句返回false
。
将noexcept
添加到第5行的末尾并且它可以工作。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.