C++ 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(

为什么此代码在visual studio 2012上编译和运行?这只是一个bug还是我遗漏了什么

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