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 ++中,规则的表达方式有所不同,但是类推。
答案 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符号与属性混合使用。