相关疑难解决方法(0)

声明constexpr initializer_list对象是否合法?

作为在讨论这个SO问题时提出的一个问题:

申报对象是否合法,可能是N3471constexpr std::initializer_list?例:

constexpr std::initializer_list<int> my_list{};
Run Code Online (Sandbox Code Playgroud)

为什么我认为它可能不合法:initializer_list必须是字面类型; 但有没有保证它是文字类型?

来自N3485的引文.

[dcl.constexpr]/9:

对象声明中使用的constexpr说明符将对象声明为const.这样的对象应具有文字类型并应初始化.

文字类型要求,[basic.types]/10,子项目类类型:

  • 具有以下所有属性的类类型(第9节):
    • 它有一个简单的析构函数,
    • 非静态数据成员(如果有)的brace-or-equal-initializers中的每个构造函数调用和完全表达式都是一个常量表达式(5.19),
    • 它是一个聚合类型(8.5.1)或者至少有一个constexpr构造函数或构造函数模板,它不是复制或移动构造函数,并且
    • 它的所有非静态数据成员和基类都是非易失性文字类型.

奖励积分;)用于回答if

constexpr std::initializer_list<int> my_list = {1,2,3,4,5};
Run Code Online (Sandbox Code Playgroud)

是合法的(有参考).虽然我认为上述+ [dcl.init.list]/5涵盖了这一点

c++ initializer-list language-lawyer constexpr c++11

20
推荐指数
1
解决办法
6173
查看次数

关于常量表达式的困惑

这是本主题的某种后续行动,涉及其中的一小部分.与前一个主题一样,让我们​​考虑一下我们的编译器有和的constexpr函数.现在,让我们直截了当地说.std::initializer_liststd::array

这有效:

#include <array>
#include <initializer_list>

int main()
{
    constexpr std::array<int, 3> a = {{ 1, 2, 3 }};
    constexpr int a0 = a[0];
    constexpr int a1 = a[1];
    constexpr int a2 = a[2];
    constexpr std::initializer_list<int> b = { a0, a1, a2 };

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

这不是:

#include <array>
#include <initializer_list>

int main()
{
    constexpr std::array<int, 3> a = {{ 1, 2, 3 }};
    constexpr std::initializer_list<int> b = { a[0], a[1], a[2] …
Run Code Online (Sandbox Code Playgroud)

c++ compile-time constant-expression constexpr c++11

15
推荐指数
1
解决办法
2418
查看次数