C++ 在C++;11、我如何指定隐式;这";参数";[[携带依赖关系]]";?
在[dcl.attr.depend]/1中,我读到: 属性[…]C++ 在C++;11、我如何指定隐式;这";参数";[[携带依赖关系]]";?,c++,c++11,this,member-functions,carries-dependency,C++,C++11,This,Member Functions,Carries Dependency,在[dcl.attr.depend]/1中,我读到: 属性[…]带有依赖关系[…]可应用于函数声明或lambda中的参数声明的声明符id, 在这种情况下,它规定参数的初始化对该对象的每个左值到右值转换(4.1)具有依赖性(1.10)。该属性也可以应用于函数的声明器id 声明,在这种情况下,它指定返回值(如果有)对函数调用表达式的求值具有依赖性 我缺少的是将属性应用于隐式this参数的方法 例如,考虑这个自由函数: void fun(int i, Foo * [[carries_dependenc
带有依赖关系
[…]可应用于函数声明或lambda中的参数声明的声明符id
,
在这种情况下,它规定参数的初始化对该对象的每个左值到右值转换(4.1)具有依赖性(1.10)。该属性也可以应用于函数的声明器id
声明,在这种情况下,它指定返回值(如果有)对函数调用表达式的求值具有依赖性
我缺少的是将属性应用于隐式this
参数的方法
例如,考虑这个自由函数:
void fun(int i, Foo * [[carries_dependency]] f);
它是等效的(但对于属性)成员版本:
void Foo::fun(int i); // can't add [[carries_dependency]] here?
我不确定,也没有一个编译器支持这个测试,但这里有一个可能性:我认为语法[gram.decl]表明你应该能够把它(“属性说明符”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
例如
我很确定这是可以做到的,但您必须查看标准中的语法。我可以试着猜测它将是类似于
[[carries_dependency]]void-fun(int)代码>或void-fun(int)[[carries_-dependency]]声明中的code>。@David Rodríguez-dribeas如果我正确阅读语法,则前者将属性应用于函数的返回值(如果有)而后者是不允许的。@MarkB:8.4.1p2似乎表明函数属性是函数声明中的最后一个元素。我很好奇:是什么编译器实际实现了C++11的属性语法?与const
成员相比,=default
等并不奇怪
struct X{
void f(int i) [[carries_dependency]];
};