C++中属性列表中的省略号应该用于什么?

11

我在C++参考文献中找到了关于C++属性允许的语法信息,它是:

[[attribute-list]]
[[ using attribute-namespace : attribute-list ]]
"其中attribute-list是一个由零个或多个属性组成的逗号分隔序列(可能以省略号...表示打包扩展)"
"我尝试使用它,但我看不出以下两者之间有什么区别:"
[[deprecated]] void f() 
{
}

[[deprecated...]] void f() 
{
}

在这两种情况下输出是相同的。


7
“*(可能以省略号...结束以表示可扩展性)*”是参考资料中的说法。它何时可用?我不知道,我认为这是一个未开发完善的功能……也许语法允许它用于未来的扩展。 - DeiDei
2
我认为这篇论文可能是相关的。 - Arnav Borborah
我想知道为什么即使没有要展开的包,[[deprecated...]] 也能编译。 - HolyBlackCat
1
您可能会发现这个视频与您相关。 - Justin
1个回答

2

这是为了保持规范性以及因为属性的未来仍在讨论中,所以被添加到了规范中。考虑到我们当前已经有了可变参数模板中的包扩展(参见可变参数模板包扩展),如下所示:

// pack expansion in function arguments
template <typename... Args>
void f(Args... args) {}

// pack expansion in inheritance
template <typename... Inherited>
struct MyClass : Inherited... {};

同样的,考虑属性的打包展开也是有意义的。以下是一些示例场景:

template <typename... Ts>
class [[Ts...]] MyClass {};

或者

template <typename... Ts>
class [[Ts()...]] MyClass {};

但是,这只是规范中的内容,目前还没有可以像那样使用的属性。


它们的两个使用示例即使没有实例化也无法在GCC和clang上编译通过。这是否是预期的? - qz-
但是...类型怎么成为属性的呢?https://godbolt.org/z/TMz56hesb - Ben

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