繁体   English   中英

调用指向成员函数后,noexcept运算符失败

[英]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()));
}

在Godbolt上

fnoexcept ,但指向它的指针不是。 因此,在定义gthis->*handler()返回一个PMF这是不noexcept (即使你碰巧返回 MF的地址noexcept ,所以当你调用写(this->*handler())()然后你调用的函数不是noexcept ,所以noexcept子句返回false

noexcept添加到第5行的末尾并且它可以工作。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM