gpt4 book ai didi

c++ - constexpr:constexpr 成员的定义和声明

转载 作者:行者123 更新时间:2023-11-27 22:44:39 25 4
gpt4 key购买 nike

如果我想使用一些方便的东西,比如 make_array 我没有机会先声明我的数组,然后再像“早些时候”那样进行定义,因为我的 var 类型不可用定义前。

所以我找到了这个答案:
Undefined reference to static constexpr char[]

在下面的例子中,我写了这个解决方案,它用 gcc 编译得很好,我不确定这是否是真正有效的 c++ 代码,因为它或多或少是一个带有定义的声明,后来又是一个没有任何内容的定义。这是允许的吗? (编译良好并不能保证代码是有效的 c++)

#include <experimental/array>
#include <iostream>

class Foo
{
private:
static decltype(auto) constexpr Bar =
std::experimental::make_array(
std::experimental::make_array( 1,2,3 ),
std::experimental::make_array( 4,5,6 )
);

public:
using ARR_TYPE = decltype( Bar );

static auto& GetArr( int idx )
{
// range check ...
return Bar[idx];
}
};

constexpr Foo::ARR_TYPE Foo::Bar;

int main()
{
for ( auto el: Foo::GetArr(0))
{
std::cout << el << std::endl;
}
}

最佳答案

管理 static constexpr 成员的规则在 C++1z 中发生了变化,这有点烦人。

C++1z 之前

来自 [class.static.data]

[...] A static data member of literal type can be declared in the class definition with the constexpr specifier; if so, its declaration shall specify a brace-or-equal-initializer in which every initializer-clause that is an assignment-expression is a constant expression. [...] The member shall still be defined in a namespace scope if it is odr-used ([basic.def.odr]) in the program and the namespace scope definition shall not contain an initializer.

这意味着您需要在声明中提供一个初始化器,而且还要在命名空间范围内提供一个没有初始化器的定义。

您的代码正是这样做的。

后 C++1z

来自同款[class.static.data]

[...] If the member is declared with the constexpr specifier, it may be redeclared in namespace scope with no initializer (this usage is deprecated; see [depr.static_constexpr]). [...]

来自[depr.static_constexpr]

For compatibility with prior C++ International Standards, a constexpr static data member may be redundantly redeclared outside the class with no initializer. This usage is deprecated.

因此,这仍然是合法的,但已弃用。

需要注意的是 static 而不是 constexpr 成员(包括 static const 成员)仍然需要在命名空间范围内定义,如果它是 ODR 使用的。

关于c++ - constexpr:constexpr 成员的定义和声明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44721729/

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