gpt4 book ai didi

c++ - 在 C++14 中使用 decltype(auto) 声明静态数据成员

转载 作者:行者123 更新时间:2023-12-02 04:14:08 26 4
gpt4 key购买 nike

此代码符合标准吗?

class Example {
public:
static int x;
};

decltype(auto) Example::x = 1;

int main(){ return 0; }

Clang 3.9.1 编译成功,但 gcc 6.3.0 失败:错误:冲突声明 'decltype(auto) Example::x'

C++14 标准 (ISO/IEC 14882:2014),第 7.1.6.4 节,第 5 段(重点是我的):

A placeholder type can also be used in declaring a variable in the condition of a selection statement (6.4) or an iteration statement (6.5), in the type-specifier-seq in the new-type-id or type-id of a new-expression (5.3.4), in a for-range-declaration, and in declaring a static data member with a brace-or-equal-initializer that appears WITHIN the member-specification of a class definition (9.4.2).

(重新)声明并不严格在类定义的成员规范内,但我没有看到任何充分的理由禁止它。此外,它还可以被视为命名空间范围内的变量(静态数据成员变量)的(重新)声明,这在第 4 段中是允许的:

The type of a variable declared using auto or decltype(auto) is deduced from its initializer. This use is allowed when declaring variables in a block (6.3), in namespace scope (3.3.6), and in a for-init-statement (6.5.3).

有一个类似的 C++11 帖子:Why doesn't the C++11 'auto' keyword work for static members?然而,只有一个答案,然后评论中就开始了争论。此外,在这种情况下,clang 通常更可靠,根据该答案,clang 是错误的,而 gcc 是正确的。

最佳答案

gcc 似乎变得很困惑,因为它试图从初始化中的右值推断出 x 的类型,而不是它在 Example 中的声明> 类。这可能会导致两种类型之间不一致,使您看起来像是在定义一个具有相同名称的新变量。

如果我理解正确,您正在寻找的行为可以通过使用从变量声明显式推断类型的宏来使用符合标准的代码来实现:

#define auto_typed_init(a) decltype(a) a

(...)

auto_typed_init(Example::x) = 2;

但是,我不明白为什么标准在这种情况下倾向于初始化程序,正如这个答案中所解释的:Why doesn't the C++11 'auto' keyword work for static members?

关于c++ - 在 C++14 中使用 decltype(auto) 声明静态数据成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43001428/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com