Visual Studio 2012 中的奇怪错误
Posted
技术标签:
【中文标题】Visual Studio 2012 中的奇怪错误【英文标题】:weird bug in visual studio 2012 【发布时间】:2014-12-17 11:41:05 【问题描述】:为什么这段代码可以在 Visual Studio 2012 上编译和运行?这只是一个错误还是我错过了什么
namespace SSSS
namespace SSS
template <class T>
class SS
public:
typedef T ValueType;
SS()std::cout<<T();
SS(T t) std::cout<<t;
;
typedef SS<double> DD;
int main()
SSSS::SSS::DD::SS d;
【问题讨论】:
VS 2012 还是 2013?当这段代码被编译时,你期望会发生什么? 为什么不希望它编译运行? 我希望编译器必须警告,SSSS::SSS::DD::SS 不是类型。 请将其添加到问题中以使其完整。 正确的语法应该是class SSSS::SSS::DD::SS d;
,这可能只是VS中的一个bug
【参考方案1】:
听起来您的编译器将SS
解释为注入的类名;在这种情况下,它是一个类型,所以声明是有效的。
但是,名称查找规则说它应该被解释为构造函数,而不是类,所以你的编译器是错误的。其他拒绝代码:http://ideone.com/7fJ1VM
有效的类型名称可以是类型别名DD
,或使用注入的类名称class DD::SS
的详细类型说明符。
【讨论】:
我不确定我是否同意第二段。这是基于 [class.qual]/2 开头的:在构造函数是可接受的查找结果的查找中。在表达式的上下文中,我不认为构造函数是一个有效的结果(地址不能取,它不能被用户代码显式调用,这不能是构造函数声明......),这意味着整个段不适用,这不是失败的原因。 [同样clang
接受代码,所以三分之二接受它]
@DavidRodríguez-dribeas:名称查找不考虑上下文,因为在知道名称的含义之前无法确定上下文。它包含一个示例,说明它确实在此处引用了构造函数。 A::A a; // error, A::A is not a type name
嗯...看看 C++14 标准,上面的措辞似乎是 DR 的主题,因为它现在显示为:lookup in which function names are not ignored33并且嵌套名称说明符指定了一个类 C: 并带有一些稍后的措辞/i>。我对我记得的规则的理解似乎是错误的,gcc
就在这里[反对clang
和VS
,与xlC
和Solaris 的CC
一致——我刚刚尝试过]
... (33 note 提到了忽略函数的三种情况:nested-name-specifier (即DD::SS::DD
中的SS
) 详细类型说明符(即class DD::SS
)或基本说明符:struct X : DD::SS
以上是关于Visual Studio 2012 中的奇怪错误的主要内容,如果未能解决你的问题,请参考以下文章
奇怪的 Visual Studio 2012 异常:无法使用文本编辑器
奇怪的 Visual Studio 2008 C++ 编译器错误