【问题标题】:gcc/clang vs. MSVC: Does a static_assert in a function have to be evaluated if the return type is bad?gcc/clang vs. MSVC:如果返回类型不好,是否必须评估函数中的 static_assert?
【发布时间】:2016-09-12 17:08:59
【问题描述】:

在这个非常简化的示例中,编译器是否需要评估 static_assert

#include <type_traits>

template<typename T>
auto foo(T t) -> void
{
    static_assert(std::is_same<T, int>::value, "T has to be int");
}

auto test(int) -> void
{}

int main()
{
    test(foo("7"));
}
  • gcc 和 clang 同意评估 static_assert
  • 另一方面,MSVC 2015 忽略了static_assert

标准要求什么?

背景:

我提供了一个依赖于模板参数的返回类型和static_assert 的组合来指示函数中正确或不正确的模板参数。这样,您可以使用返回类型进行编译时评估,也可以直接运行static_assert

但是,如果我不能确定我的 static_assert 是否真的被评估过,我需要重新考虑一些事情......

【问题讨论】:

  • Cannot reproduce(这会失败并出现不同的错误,主要是在函数test中从void转换为intSame thing with gcc。我的MSCV 2015不会忽略static_assert
  • 您是说您的 MSVC 2015 显示文本“T 必须是 int”?
  • 是的,代码无法编译,因为“T 必须是 int”

标签: c++11 gcc visual-c++ clang language-lawyer


【解决方案1】:

为了使实现合规,它必须满足以下要求:

如果程序包含违反任何可诊断规则或 本标准中描述的构造的出现 当实现不支持时“有条件支持” 该构造,一个符合要求的实现应至少发出一个 诊断信息。

它不是说“每个错误至少有一条诊断消息”,而是“至少一条诊断消息”期间。

【讨论】:

  • 你有源链接吗?
  • 啊,找到了,标准中的 [intro.compliance]。谢谢。
【解决方案2】:

编译器唯一必须做的就是在存在可诊断的标准违规时提供诊断。我当然希望 MSVC 能做到这一点。

static_assert 在一个格式错误的程序中,即使没有这个 static_assert 也可能会触发,也可能不会触发,因为你甚至不能谈论什么是 true 和什么是 false 以及什么是格式错误的声明程序。

另一个同样精神的例子:

void[] foo() {
  static_assert (false, "Oops");
}

g++ 只抱怨返回类型无效,clang 也会触发静态断言。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-06-09
    • 1970-01-01
    • 1970-01-01
    • 2012-03-07
    • 1970-01-01
    • 1970-01-01
    • 2019-07-11
    相关资源
    最近更新 更多