Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 模板化类的格式错误的非模板化方法的实例化_C++_Templates_Instantiation - Fatal编程技术网

C++ 模板化类的格式错误的非模板化方法的实例化

C++ 模板化类的格式错误的非模板化方法的实例化,c++,templates,instantiation,C++,Templates,Instantiation,我在研究。一个非常符合逻辑的解释表明,它是遵循C++哲学的尽早捕获错误< /强> 我的问题是,为什么这种哲学不遵循非模板化方法。在实例化模板化类时,为什么不在第2阶段检查所有非模板化方法,而不是检查何时以及是否调用该方法 例如: 模板 结构X{ auto foo()//非模板化(重要) { T{}; 返回t.non_existing(); } }; int main() { X;//(1)这编译正常。 //某处有一个遥远的星系, //也许是在一些不相关的代码里面 x、 foo();/(2)错误

我在研究。一个非常符合逻辑的解释表明,它是遵循C++哲学的<强>尽早捕获错误< /强>

我的问题是,为什么这种哲学不遵循非模板化方法。在实例化模板化类时,为什么不在第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
}