gpt4 book ai didi

c++ - 类模板部分特化中是否允许 noexcept 推导?

转载 作者:可可西里 更新时间:2023-11-01 17:53:19 26 4
gpt4 key购买 nike

对于下面的程序,Clang 5 (trunk) 报告 IsNoexcept 不可推导,而 GCC 7.1 会出现段错误。 标准(草案)对此有何评论?这是编译器 QOI 问题吗?

static_assert(__cpp_noexcept_function_type, "requires c++1z");

template<typename T>
struct is_noexcept;

template<bool IsNoexcept>
struct is_noexcept<void() noexcept(IsNoexcept)> {
static constexpr auto value = IsNoexcept;
};

static_assert(is_noexcept<void() noexcept>::value);
static_assert(!is_noexcept<void()>::value);

int main() {}

与提案 P0012 相关。

最佳答案

  1. [temp.deduct.type]/8列出可以从中推导出模板参数的所有类型形式。 异常规范不在列表中,因此不可推导。
  2. 作为an extension , GCC 允许从 noexcept 推导以简化 std::is_function 的实现。该扩展程序似乎只经过了非常轻微的测试。
  3. 该扩展最初是由 Clang 的维护者建议的,并且似乎在委员会中得到了一些支持,但是 it's not clear if it will eventually make its way into the standard .
  4. 这不是一个符合规范的扩展,因为它改变了定义明确的代码的含义,例如,g(f) 的值与以下片段:

    void f() noexcept;

    template<bool E = false, class R>
    constexpr bool g(R (*)() noexcept(E)){
    return E;
    }

关于c++ - 类模板部分特化中是否允许 noexcept 推导?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44247151/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com