2014-11-05 54 views
4

下面的代码在使用GCC和Clang使用C++ 11模式构建时无需编译错误/警告。但是,如果我尝试编译没有C++ 11模式,并在第二个范围发生错误。本地类作为谓词pre C++ 11

#include <algorithm> 
#include <vector> 

struct astruct 
{ 
    int v; 
}; 

struct astruct_cmp0 
{ 
    bool operator()(const astruct& a0, const astruct& a1) { 
    return a0.v < a1.v; 
    } 
}; 

int main() 
{ 
    std::vector<astruct> alist; 
    { 
     // Works - no errors 
     std::stable_sort(alist.begin(),alist.end(),astruct_cmp0()); 
    } 

    { 
     struct astruct_cmp1 
     { 
     bool operator()(const astruct& a0, const astruct& a1) { 
      return a0.v < a1.v; 
     } 
     }; 

     // error: template argument uses local type 'astruct_cmp1' 
     std::stable_sort(alist.begin(),alist.end(),astruct_cmp1()); 
    } 

    return 0; 
} 

我的问题是:什么是C++ 11的变化,允许本地结构定义?有人可以请我指向标准中的特定部分(可能是9.8节?)

回答

6

在C++ 03函数中,本地类型不是可行的模板参数。在C++ 11函数中,本地类型是可行的模板参数。在C++ 03的关键报价14.3.1 [temp.arg.type]段2:

以下类型不应被用作模板参数的一个模板类型参数:

  • 类型,其名字没有联动
  • ...

在C++ 11这个约束被删除。

联动定义为当上的相关部分为3.5 [basic.link](在这两个标准),这是相当长的,并指向实体不联动由排斥,第8段中C++ 03:

这些规则未涵盖的名称没有链接。 ...

函数中定义的类型未在“这些规则”中列出。