我正在研究two phase name lookup.一个非常合乎逻辑的解释表明,one of the main reasoning是因为它遵循C语言尽早发现错误.
我的问题是为什么这种哲学不遵循非模板化方法.而不是检查何时以及是否调用该方法,为什么不在实例化模板化类时检查阶段2中的所有非模板化方法?
例如.:
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
}
如果你从不写(2)程序编译并运行没有任何问题,虽然foo对于实例化的X< int>是非法的.
无论你是否曾经调用foo,我认为第(1)行应该会产生错误.
在编写模板化类时,这可以让错过一个错误直到你最终调用有问题的方法(2),而不是在实例化模板化类(1)时得到错误.
另外,健全性检查:如果我实例化X< int>,则代码是有效的. (1)但从不调用X< int> :: foo(2)?或者它是否像“形成不良,无需诊断”?如果是后者,那么这是更早发现错误的原因.
解决方法:
代码有效.
此功能旨在允许像std :: vector这样的东西具有运算符<或者运算符==简单地写. 该操作符会尝试呼叫<或= =关于其元素,盲目地.如果它无效,一旦你打电话给<或者==在包装矢量上它将无法编译. 但如果你从未这样做过,那么矢量就可以了. Modern C会建议使用SFINAE条件方法技术或C 20 Requires子句,因此vector只有==或<如果是有效的操作.在设计vector时,这些技术都不成熟,并且具有无效模板类方法的能力是一个重要特征. 除了无效代码的早期失败之外,有条件存在==允许包装代码以检测==是否可以安全地调用:古老的技术不允许这种内省.我不得不编写专门用于标准容器模板的自定义特征来检测是否<在至少一个案件中打电话是安全的.
标签:c,templates,instantiation 来源: https://codeday.me/bug/20190824/1702973.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。