一个简单的程序,如下所示,根本没有c++11语法(e.cpp)
#include<iostream>
using namespace std;
namespace m{
class my{
public:
enum A{
u=1,
v=2,
w=3
};
static A f(A a){
return (A)(a + A::u);
}
};
int main(){
using namespace m;
my::A r=my::f(my::u);
return 0;
}使用g++4.1.2编译它:
e.cpp:17:2: warning: no newline at end of file
e.cpp: In static member function ‘static m::my::A m::my::f(m::my::A)’:
e.cpp:11: error: expected primary-expression before ‘)’ token
e.cpp:11: error: ‘A’ is not a class or namespaceg++4.9.2与-std=c++98的结合
g++ e.cpp -std=c++98
e.cpp: In static member function ‘static m::my::A m::my::f(m::my::A)’:
e.cpp:11:36: error: ‘A’ is not a class or namespace
static A f(A a){return (A)(a + A::u);}
^但是使用-std=c++11是可以的:
g++ e.cpp -std=c++11为了使它使用c++98进行编译,我将其更改为避免使用"A::“:
static A f(A a){return (A)(a + u);}因此,在c++98中,嵌入的枚举类在类中是不被识别的,而在c++11中则是工作的。这是枚举解析上的差异,还是c++98标准中以前的语法错误?
发布于 2018-09-13 11:54:08
枚举值不受枚举类型的范围(在C++98或C++11中)。在以下示例中:
namespace N {
enum E { X };
}X直接位于命名空间N的范围内。它的完全限定标识符将是::N::X。
C++11改变了这种行为,按照相同的定义,X 的标识符也可以使用::N::E::X引用。
[dcl.enum/11]类范围中声明的枚举数可以使用类成员访问操作符(::、.(点)和->(箭头))引用,参见5.2.5。示例: 结构X{ enum方向{左侧=‘l’,右=‘r’};int f(int i) {返回i==left ?0: i==right ?1: 2;};void g(X* p) {方向d;//错误:不位于范围int i中的方向;i=p->f(左);//错误:左不位于范围i=p->f(X::右);// OK i=p->f(p->左);// OK // .} -end实例
发布于 2018-09-13 11:52:27
枚举名称不能用于在C++11之前限定枚举数。因此,在C++98模式中没有错误,代码只是格式错误。
你推断规则变了是正确的。
C++ FAQ 列出对C++11中的枚举所做的更改,并引用了推动这些变化的建议。
https://stackoverflow.com/questions/52312997
复制相似问题