C++ visual studio 2012中的奇怪bug
为什么此代码在visual studio 2012上编译和运行?这只是一个bug还是我遗漏了什么C++ visual studio 2012中的奇怪bug,c++,visual-studio,templates,visual-studio-2012,C++,Visual Studio,Templates,Visual Studio 2012,为什么此代码在visual studio 2012上编译和运行?这只是一个bug还是我遗漏了什么 namespace SSSS { namespace SSS { template <class T> class SS { public: typedef T ValueType; SS(
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;
}
名称空间SSS
{
名称空间SSS
{
模板
SS类
{
公众:
typedef T ValueType;
SS(){std::cout听起来您的编译器正在将SS
解释为注入的类名;在这种情况下,它是一个类型,因此声明是有效的
但是,名称查找规则规定它应该被解释为构造函数,而不是类,因此您的编译器是错误的。其他人拒绝该代码:
有效的类型名称应该是类型别名DD
,或者是使用注入类名称的详细类型说明符,class DD::SS
VS 2012或2013?编译此代码时,您预计会发生什么?为什么您希望它不会编译和运行?我预计,编译器必须警告,SSSS::SSS::DD::SS不是一个类型e、 请将其添加到问题中,使其完整。正确的语法应该是class SSSS::SSS::DD::SS d;
,这可能只是VSI中的一个错误。我不确定我是否同意第二段。这是基于[class.qual]/2开头:在一个查找中,构造函数是一个可接受的查找结果。在表达式的上下文中,我认为构造函数不是一个有效的结果(地址不能获取,用户代码不能显式调用它,这不能是构造函数声明…),这意味着整个段落不适用,这不是失败的原因。[同时clang
接受代码,因此三分之二的人接受代码]@DavidRodríguez dribeas:名称查找不考虑上下文,因为只有知道名称的含义才能确定上下文。它包括一个示例,说明它确实引用了这里的构造函数。A::A;//错误,A::A不是类型名
Uhm…看看C++14标准,这个词似乎上面的g是DR的主题,它现在的内容是:不忽略函数名的查找33,嵌套的名称说明符指定一个类C:在后面的一些措词中,这样的构造函数名只能在命名构造函数的声明的声明器id或using声明中使用ERD似乎是错误的,gcc
就在这里[与clangg
和VS
相反,与xlC
和Solaris的CC
——我刚刚尝试过的)一致]。(33注释提到了忽略函数的三种情况:嵌套名称说明符(即DD::SS::DD
中的SS
)详细类型说明符(即class-DD::SS
)或基本说明符:struct X:DD::SS