Sup*_*mum 1 c++ templates language-lawyer
考虑以下 C++ 程序:
template<typename X>
struct S
{
X x;
};
template<typename>
void f()
{
S<void> s;
}
int main()
{
}
Run Code Online (Sandbox Code Playgroud)
当使用“-std=c++17 -pedantic-errors”编译时,它会给出clang的编译错误,但不会给出gcc的编译错误。
C++ 标准对这个程序有什么看法?是否有效?如果它无效,它是否具有未定义的行为?
如果回答这个问题的人可以继续并在他们的答案中包含 C++ 标准的相关部分,那就太好了。
用于尝试此操作的编译器资源管理器链接:https : //godbolt.org/z/Ke1K7b
您的函数模板使程序格式错误,无需诊断。
[温度]
8可以在任何实例化之前检查模板的有效性。[注意:知道哪些名称是类型名称允许以这种方式检查每个模板的语法。— 尾注 ] 程序格式错误,无需诊断,如果:
- 不能为模板或 constexpr if 语句的子语句生成有效的特化,并且模板未实例化,或
无论你f用什么实例化,它都会导致无效的声明。所以它与那个段落匹配。
Clang 会立即检查,GCC 不会,但这两种方法同样有效。无论哪种方式,问题都出在模板中的构造上,而不是出在编译器上。
| 归档时间: |
|
| 查看次数: |
76 次 |
| 最近记录: |