在C++11中本地类的用法有什么变化吗?
在C++03中,本地类似乎不能用作模板参数(我记得)。
考虑这段代码,
template<typename T> void f(const T&) {}
//Note : S is a local class defined inside main()
int main() { struct S{}; f(S()); } //I want template argument to be deduced.但是它给出了编译错误(C++03模式),即(ideone):
prog.cpp:4: error:调用‘f(main()::s)’没有匹配函数
但是,当在C++11模式(ideone)编译它时,它编译得很好,这对我来说是有意义的,否则lambda就不能工作了。因此,我想,至少在本地类的使用上有这种变化。我说的对吗?与本地类有关的其他更改是什么?
请引用标准中的相关文本(C++03和C++11 ),以便读者进行比较,并供以后参考。
发布于 2011-11-20 19:07:30
通过比较两种标准中的第14.3.1/2节,可以看出这些差异。
本地类型、没有链接的类型、未命名类型或由这些类型中的任何类型组合而成的类型不应用作模板类型参数的模板参数。[例:
模板类X{ /* . */ };void (){ struct { /* . */ };X x3;//错误:用作模板的本地类型-参数X x4;//错误:指向用作模板参数的本地类型的指针-参数}
注意:模板类型参数可能是不完全类型(3.9)。
[例:
模板类X{ };模板void f( t ) {}{} unnamed_obj;void f() { struct A{ };enum { e1 };ty胡枝子结构{} b;B;X x1;// OK X x2;// OK X x3;// OK f(e1);// OK f(unnamed_obj);// OK f(b);// OK }
注:模板类型参数可能是不完整类型(3.9)。-尾注
C++03显式禁止模板类型参数中的本地类。C++11没有,甚至包括这样的一个有效使用的例子。
发布于 2011-11-20 18:59:00
从较旧的标准:
(14.3)局部类型、没有链接的类型、未命名的类型或由这些类型组合而成的类型不应用作模板类型参数的模板参数。
它似乎在C++11标准中被删除了。
更多限制:
本地类中的
(9.8)声明只能使用来自封闭作用域的类型名称、静态变量、外部变量和函数以及枚举数。
(9.8)本地类不应有成员模板。
(14.5.4)朋友模板不得在本地类中声明。
(9.4.2 )本地类不应具有静态数据成员。
(9.3)本地类的成员函数(9.8)没有联系。
发布于 2011-11-20 18:54:14
根据my own question,该限制被删除,本地类可以用作模板参数。
不过,我看没有提到新的标准。
https://stackoverflow.com/questions/8203750
复制相似问题