C ++属性名称空间?

时间:2018-07-16 04:19:15

标签: c++ c++11

Cppreference说,双括号[[ ]]中的属性列表可以作为标识符。

假设我的C ++程序中有一个名为noreturn的变量(因此它是变量的标识符)。它会干扰[[noreturn]]属性的解释吗?我的想法是,如果 attribute-list 中的标识符与普通标识符共享相同的名称空间(在此示例中,它们都保留在全局名称空间中),则编译器可能会将其解释为变量,则它不会将其识别为有效的C ++属性。

示例:

int noreturn = 1;
[[ noreturn ]] void f() {
     throw "error";
}

在这里给出[[noreturn]]的用法:https://en.cppreference.com/w/cpp/language/attributes/noreturn

更新:为澄清起见,我知道在C(不是C ++)中有4个“预定义”名称空间:用于标签,用于标签,用于结构/联合成员以及用于普通标识符。但是它是为C(C11 6.2.3)定义的,因此我想知道C ++ 11是否向其中添加了“属性”名称空间。根据公认的答案,在C ++中,规则的表达方式有所不同,但是类推。

1 个答案:

答案 0 :(得分:1)

属性属于不同的命名空间(与namespace不相关)。属性有一个命名空间。

标签相同:

int l=2;
l: if (l<5) { l++; goto l; };

也是有效的(即使可能令人困惑地阅读)。

  

编译器可能会将其解释为变量的标识符,

不,不会!

因此,在您的示例中,编译器不会将变量noreturn混入属性noreturn,就像在上面的示例中,它不会将变量l混入变量l

请参见C ++ 11标准n3337§7.6.1[dcl.attr.grammar],其中进一步说明:

  

不对包含在其中的任何标识符执行名称查找(3.4)   属性令牌

出于可读性的考虑,我建议不要将属性名称用作变量标识符(但这只是一个提示,而不是必要条件)。

顺便说一句,您不想将预处理器#define-d符号与属性混合使用。