gpt4 book ai didi

c++ - 试图理解 C++14 中的 [expr.const]

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

在C++14标准中,是否禁止下面对象a声明

class A{ int i = 1; public: A():i{1}{} };

int main()
{
constexpr A a{};
}

参见 live example

请注意,我突出显示了 declaration 一词,因为我认为 §5.19[expr.const]p2 中的要点 (2.7.2) 或 (2.7.3) 不是答案对于这个问题。

最佳答案

[dcl.constexpr]p9:

A constexpr specifier used in an object declaration declares the object as const. Such an object shall have literal type and shall be initialized. If it is initialized by a constructor call, that call shall be a constant expression (5.19). [...]

你现在得到的错误是因为你的类型不是文字类型。您的类型不是文字类型,因为它确实具有自定义构造函数,但没有任何 constexpr 构造函数。错误消息中的措辞对于确切的要求相当清楚。

如果添加constexpr 构造函数(但不是默认构造函数),错误消息会更改:

class A{ int i = 1; public: A():i{1}{} constexpr A(int){} };

int main()
{
constexpr A a{};
}

现在错误信息变成了

error: call to non-constexpr function ‘A::A()’     constexpr A a{};

这是我加粗的第二部分:它不是必须是常量表达式的初始化器。你是对的,你的初始化器根本不是一个表达式。构造函数调用必须是一个常量表达式,虽然它没有在源代码中明确表达,但它仍然是一个表达式。这在 [expr.const] 中很清楚地涵盖了:

  • an invocation of a function other than a constexpr constructor for a literal class, a constexpr function, or an implicit invocation of a trivial destructor (12.4) [...]

您已经在问题中提到了这一点。

关于c++ - 试图理解 C++14 中的 [expr.const],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34240136/

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