在C++11中,如何指定隐式的“this”参数“[[carries_dependency]]”?

21
在[dcl.attr.depend]/1中,我读到:
属性[...] carries_dependency [...] 可以应用于函数声明或lambda中parameter-declarationdeclarator-id,这种情况下它指定参数的初始化对该对象的每个左值转右值转换(4.1)(1.10)都具有依赖性。该属性也可以应用于函数声明的declarator-id,这种情况下,如果有的话,它指定返回值对函数调用表达式的求值具有依赖性。
我缺少的是一种将属性应用于隐式this参数的方法。
例如,考虑以下自由函数:
void fun(int i, Foo * [[carries_dependency]] f);

并且它有一个等效的成员版本(但是针对属性):

void Foo::fun(int i); // can't add [[carries_dependency]] here?

1
我相信这是可以做到的,但你需要在标准中查找语法。我猜测它可能会像这样:[[carries_dependency]] void fun( int ); 或者在声明中写成 void fun(int) [[carries_dependency]]; - David Rodríguez - dribeas
1
如果我理解得正确,前者将属性应用于函数的返回值(如果有的话),而后者则不允许。- @David Rodríguez - dribeas - Mark B
@MarkB:8.4.1p2 似乎表明函数属性应该是函数声明中的最后一个元素。 - David Rodríguez - dribeas
11
我很好奇:实际上哪个编译器实现了C++11的属性语法? - Nicol Bolas
1个回答

3

我不确定并且没有支持此项测试的编译器,但这里提供一种可能性:根据语法[gram.decl],你应该可以把它(“attribute-specifier_opt”)放在与“const”相同的位置来表示常量指针(“cv-qualifier-seq_opt”),这是有道理的:

parameters-and-qualifiers:
    ( parameter-declaration-clause ) attribute-specifier_opt cv-qualifier-seq_opt
        ref-qualifier_opt exception-specification_opt

例如:

struct X{
    void f(int i) [[carries_dependency]];
};

1
const成员相比,=default等情况并不令人意外。 - sehe

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接