std :: is_member_function_pointer不适用于noexcept成员函数

Mar*_*tto 10 c++ c++17

我遇到了麻烦std::is_member_function_pointer.据我所知,在给定noexcept成员函数时它不起作用.我在标准中找不到任何声明它对noexcept合格的成员函数不起作用的东西.问题示例:

#include <type_traits>

class A {
public:
    void member() noexcept { }
};

int main()
{
    // fails at compile time if A::member is a data member and not a function
    static_assert(std::is_member_function_pointer<decltype(&A::member)>::value,
                  "A::member is not a member function."); 
}
Run Code Online (Sandbox Code Playgroud)

它给了我以下错误:

member.cpp:11:5:错误:static_assert因需求'std :: is_member_function_pointer :: value'而失败"A :: member不是成员函数." static_assert(std :: is_member_function_pointer :: value,^ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~ 1生成错误.

如果我删除了noexcept资格,它就应该编译.

这已在Debian Stretch上测试过,使用了clang 6.0和libstdc ++ 6.3.0我在这里遗漏了什么?从我可以阅读,这应该工作.

ein*_*ica 1

您的代码可以在 GodBolt 上编译- 无论是否noexcept在成员上 - 以及所有 MSVC 2017、GCC 5.5、6.x、8.x 、 clang 5、6、7。

在我的 Debian Stretch(嗯,确实是相应的Devuan)上 - 我可以重现这个问题。有趣的是,即使我切换到 libc++,编译也会失败。

所以:

  • 这不是 clang-6 本身的错误
  • 这本身并不是 libstdc++ 6.3.0 的错误
  • 这可能与 Debian Stretch 的配置/设置方式有关。我建议在 irc.freenode.net 上的 #debian 频道上提出这个问题