【发布时间】:2018-08-07 09:23:49
【问题描述】:
最近我偶然发现了 VS 2017 中的 Visual C++ 编译器一致性模式开关。我阅读了this explanation,其中给出了开关如何禁止不合格代码编译的以下内容
template<typename T>
struct B {
int f();
};
template<typename T>
struct D : B<T> {
int g();
};
template<typename T>
int D<T>::g() {
return f(); // error: should be ‘this->f()’
}
在 D::g 的定义中,符号 f 来自依赖基 B 类但标准 C++ 不允许检查依赖基数 寻找满足 f 使用的声明时的类。 是Visual C++长期以来未能解决的源代码中的错误 诊断。
好的,好的,我明白了。除了一件事。为什么?
为什么标准不允许允许检查 f() 的依赖基类?这个禁令的理由是什么。标准给一个吗?
如果 B 和 D 都只是常规的非模板结构,则 f() 将被正确地解释为对基类(呃...基结构)成员函数的调用。那么,当它们是模板时,为什么不这样做呢?
(我确信这是有充分理由的,但目前我的理解有限,这似乎很烦人。我确实尝试过搜索并找到了at least one question,但没有找到“为什么” )
【问题讨论】:
标签: c++ templates visual-c++ visual-studio-2017 standards-compliance