代码之家  ›  专栏  ›  技术社区  ›  Jackie

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

  •  4
  • Jackie  · 技术社区  · 9 年前

    #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

    2 回复  |  直到 9 年前
        1
  •  7
  •   Justin    9 年前

    static_assert 没有字符串参数,您正在使用C++17。在C++17中, noexcept 成为字体系统的一部分。这意味着:

    using F = void(C::*)();
    

    此PMF不是 无例外 . 调用它相当于调用 noexcept(false) 成员函数。您需要将函数类型标记为 无例外 :

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

    On Godbolt

        2
  •  3
  •   Zachary Turner    9 年前

    f noexcept ,但指向它的指针不是。所以在定义 g , this->*handler() 无例外 (即使您碰巧返回了MF的地址 无例外 ,所以当你通过写作来称呼它的时候 (this->*handler())() 然后调用的函数不是 无例外 第三条退货 false

    添加 到了5号线的尽头,它就成功了。