【发布时间】: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转换为int。Same thing with gcc。我的MSCV 2015不会忽略static_assert -
您是说您的 MSVC 2015 显示文本“T 必须是 int”?
-
是的,代码无法编译,因为“T 必须是 int”
标签: c++11 gcc visual-c++ clang language-lawyer