C++11 gcc/clangvs.MSVC:如果返回类型错误,是否必须对函数中的静态_断言求值?
在这个非常简化的示例中,是否需要编译器来计算C++11 gcc/clangvs.MSVC:如果返回类型错误,是否必须对函数中的静态_断言求值?,c++11,gcc,visual-c++,clang,language-lawyer,C++11,Gcc,Visual C++,Clang,Language Lawyer,在这个非常简化的示例中,是否需要编译器来计算静态断言 #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"));
静态断言
#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"));
}
#包括
模板
自动foo(T)->void
{
静态断言(std::is_same::value,“T必须是int”);
}
自动测试(int)->void
{}
int main()
{
测试(foo(“7”));
}
- gcc和clang同意评估
静态断言
- 另一方面,MSVC 2015忽略了
静态断言
static_assert
的组合,以指示函数中正确或不正确的模板参数。这样,您可以使用返回类型进行编译时计算,也可以直接运行static\u assert
但是,如果我不能确定我的
static\u assert
是否得到了实际评估,我需要重新考虑几件事…编译器必须做的唯一一件事就是在出现可诊断的标准冲突时提供诊断。我当然希望MSVC能做到这一点
static\u assert
在一个格式错误的程序中,即使没有这个static\u assert
也可能会触发,也可能不会触发,因为你甚至不能谈论什么是true
什么是false
以及什么是格式错误的程序中的声明
同样精神的另一个例子:
void[] foo() {
static_assert (false, "Oops");
}
g++只会抱怨返回类型无效,而clang也会触发静态断言。编译器必须做的唯一一件事就是在出现可诊断的标准冲突时提供诊断。我当然希望MSVC能做到这一点
static\u assert
在一个格式错误的程序中,即使没有这个static\u assert
也可能会触发,也可能不会触发,因为你甚至不能谈论什么是true
什么是false
以及什么是格式错误的程序中的声明
同样精神的另一个例子:
void[] foo() {
static_assert (false, "Oops");
}
g++只会抱怨返回类型无效,而且clang还会触发静态断言。为了实现兼容,它必须满足以下要求: 如果程序违反了任何可诊断规则或 本标准中所述结构的出现情况如下: 实现不支持时的“有条件支持” 对于该构造,一致性实现应至少发布一个 诊断信息
它不是说“每个错误至少有一条诊断消息”,而是说“至少有一条诊断消息”周期。为了使实现符合要求,它必须满足以下要求: 如果程序违反了任何可诊断规则或 本标准中所述结构的出现情况如下: 实现不支持时的“有条件支持” 对于该构造,一致性实现应至少发布一个 诊断信息
它不是说“每个错误至少有一条诊断消息”,而是说“至少有一条诊断消息”周期。(由于另一个错误而失败,主要是在函数
测试中从void
转换为int
。我的MSCV 2015没有忽略static\u assert
你是说你的MSVC 2015显示文本“t has be int”?是的,代码没有编译是因为“t has be be int”(由于另一个错误而失败,主要是在函数测试中从void
转换为int
。我的MSCV 2015没有忽略static\u assert
你是说你的MSVC 2015显示文本“t has be int”?是的,代码没有编译是因为“t has be be int”你有你的来源的链接吗?啊,在标准中找到了[intro.compliance]。谢谢。你有你的来源的链接吗?啊,在标准中找到了[intro.compliance]。谢谢。