C++ 模板化类的格式错误的非模板化方法的实例化
我在研究。一个非常符合逻辑的解释表明,它是遵循C++哲学的<强>尽早捕获错误< /强> 我的问题是,为什么这种哲学不遵循非模板化方法。在实例化模板化类时,为什么不在第2阶段检查所有非模板化方法,而不是检查何时以及是否调用该方法 例如:C++ 模板化类的格式错误的非模板化方法的实例化,c++,templates,instantiation,C++,Templates,Instantiation,我在研究。一个非常符合逻辑的解释表明,它是遵循C++哲学的尽早捕获错误< /强> 我的问题是,为什么这种哲学不遵循非模板化方法。在实例化模板化类时,为什么不在第2阶段检查所有非模板化方法,而不是检查何时以及是否调用该方法 例如: 模板 结构X{ auto foo()//非模板化(重要) { T{}; 返回t.non_existing(); } }; int main() { X;//(1)这编译正常。 //某处有一个遥远的星系, //也许是在一些不相关的代码里面 x、 foo();/(2)错误
模板
结构X{
auto foo()//非模板化(重要)
{
T{};
返回t.non_existing();
}
};
int main()
{
X;//(1)这编译正常。
//某处有一个遥远的星系,
//也许是在一些不相关的代码里面
x、 foo();/(2)错误就在这里
}
如果您从未编写(2),程序编译和运行时不会出现任何问题,尽管对于实例化的X
来说foo
是非法的
我认为第(1)行应该生成错误,不管您是否调用foo
在编写模板类时,这可能会让错误从裂缝中溜走,直到最终调用有问题的方法(2),而不是在实例化模板类(1)时出现错误
还有健全性检查:如果我实例化X
(1)但从未调用X::foo
(2),代码是否有效?还是类似于“格式不正确,不需要诊断”?如果是后者,那么这就是更早捕获错误的更多原因。代码是有效的
此功能旨在允许像
std::vector
这样的操作进行操作员安全性检查:代码(1)有效。至于原因:想象一下,如果必须为不可复制的T
s禁用复制构造函数,那么可以为std::vector
编写一个复制构造函数。dto用于push_back(const T&)
等@Angew我想象这是通过禁用SFINAE的方法来管理的。
template <class T>
struct X {
auto foo() // non-templated (important)
{
T t{};
return t.non_existing();
}
};
int main()
{
X<int> x; // (1) this compiles OK.
// somewhere is a galaxy far far away,
// maybe deep inside some unrelated code
x.foo(); // (2) the error is here
}