局部类:c++ 03与c++ 11
Local classes : C++03 vs. C++11
在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:错误:没有匹配函数调用' f(main()::S) '
然而,它在c++ 11模式(ideone)下编译时编译得很好,这对我来说是有意义的,否则lambda将无法工作。所以我猜至少在本地类的使用上有这样的变化。我说的对吗?关于本地类的其他变化是什么?
请引用标准(c++ 03和c++ 11)中的相关文本,以便读者进行比较,并供将来参考。
通过比较两个标准中的§14.3.1/2可以看出差异。
- c++ 03
本地类型、无链接类型、未命名类型或由这些类型中的任何一种组合而成的类型均应不能用作模板类型形参的模板实参。(例子:
template <class T> class X { /* ... */ }; void f() { struct S { /* ... */ }; X<S> x3; // error: local type used as template-argument X<S*> x4; // error: pointer to local type used as template-argument }
-end example][注意:模板类型参数可以是不完整类型(3.9)。)
c++ 0 x (n3290)
(例子:
template <class T> class X { }; template <class T> void f(T t) { } struct { } unnamed_obj; void f() { struct A { }; enum { e1 }; typedef struct { } B; B b; X<A> x1; // OK X<A*> x2; // OK X<B> x3; // OK f(e1); // OK f(unnamed_obj); // OK f(b); // OK }
注意:模板类型参数可以是不完整类型(3.9)。
c++ 03明确禁止在模板类型参数中使用局部类。c++ 11没有,甚至还包含了一个有效使用这种方法的例子。
源自旧标准:
(14.3)局部类型、没有链接的类型、未命名类型或由这些类型组合而成的类型,不得用作模板类型形参的模板实参。
它似乎在c++ 11标准中被删除了。
更多的限制:
(9.8)局部类中的声明可以只使用类型名、静态变量、外部变量和函数,以及外围的枚举数范围。
(9.8)局部类不能有成员模板。
(14.5.4)友元模板不能在局部类中声明。
(9.4.2)局部类不能有静态数据成员。
(9.3)局部类(9.8)的成员函数没有关联。
根据我自己的问题,限制被取消了,局部类可以用作模板参数。
但是我没有看到任何关于新标准的参考。
- 使用的未初始化局部变量'Quick'
- 修复未初始化的局部变量错误
- 局部变量保留函数中的值
- 为什么 'main' 函数中的局部 int 变量会自动初始化?
- 如何使用 C++ 中的继承函数访问派生类中的局部变量
- 将引用分配给局部变量,如果局部变量超出范围,它会超出范围吗?
- 在 OpenGL 中将笛卡尔世界坐标转换为球面局部坐标
- Gnuplot_i.hpp C++接口绘制局部变量而不是文件
- 如何在函数外部访问函数中局部变量的值?
- 赋予全局变量而不是局部变量优先级的函数 - (异常行为)
- C++中静态方法的局部变量范围
- 未初始化的局部变量错误甚至认为我初始化了它(C++)
- 离开范围后如何保护局部变量的值?
- 局部变量名称冲突
- C++ lambda:如何'freeze'局部变量的值?
- 我应该使我的局部变量常量还是可移动的
- 获取具有静态局部变量的绑定/推断捕获 lambda 的函数指针
- 全局和局部变量初始化与 constexpr 的差异背后的基本原理
- 返回对局部变量 - C++ 的引用
- 函数局部静态变量:从性能角度来看的优点/缺点