给定一个C ++ 11枚举类,嵌套在几个长而丑陋的名称空间中:
namespace
long_and_ugly
{
enum class
colour
{
red,
green,
blue
};
}
别名是否可以由枚举值组成?使用clang ++ 3.5,可以执行以下操作:
using long_and_ugly::colour; // take all the values into the current namespace
using long_and_ugly::colour::red; // take only 'red' into the current namespace
function_taking_colour_argument( red ); // instead of fully referring to the value
然而,g ++ 4.9抱怨道。我无法复制其错误消息,因为我无法访问代码,但它明确抱怨使用using指令或声明。我也试过这个:
using red = long_and_ugly::colour::red;
但它也失败了。抱歉没有粘贴错误,我很抱歉。不过,我相信你应该能够重现它。
是否可以在标准C ++ 11中为枚举值声明别名,还是使用了clang扩展?
如果是,正确的语法是什么?
答案 0 :(得分:21)
问题在于,当使用指定 using-declaration 时,标准表示您不应引用枚举类中的枚举器。
7.3.3p7
using
声明[namespace.udecl]
(n3337)using-declaration 不得命名范围的枚举器。
namespace N {
enum class E { A };
}
using N::E; // legal
using N::E::A; // ill-formed, violation of [namespace.udecl]p7
注意:clang
确实接受上述两行; here's a relevant bug report。
引用枚举类本身的实际名称是完全可以的,但是尝试引用其枚举器之一是不正确的。
标准说别名声明只能用于引用类型名称,因为枚举器不是在这种情况下使用一种类型的形式是不正确的。
namespace N {
enum class E { A };
}
using x = N::E; // legal, `N::E` is a type
using y = N::E::A; // ill-formed, `N::E::A` isn't a type
您可以声明一个常量,使用您想要“别名”的值初始化您所选择的任何名称:
namespace N {
enum class E { A };
}
constexpr N::E x = N::E::A;
int main () {
N::E value = x; // semantically equivalent of `value = N::E::A`
}
答案 1 :(得分:2)
排序:
namespace long_and_ugly {
enum class colour
{
red,
green,
blue
};
}
const colour red = long_and_ugly::colour::red;