gpt4 book ai didi

c++ - 什么时候构造 constexpr 对象?

转载 作者:可可西里 更新时间:2023-11-01 15:22:32 24 4
gpt4 key购买 nike

constexpr 对象何时相对于具有静态存储持续时间的非constexpr 非本地对象构造?它们是否在任何其他对象初始化之前开始其生命,即在动态初始化之前?

我正在考虑拥有一个 string_literal class (live example) 是否合理例如,用于将 std::string 与某些关键字进行比较:

class string_literal
{
// private members
public:
constexpr string_literal(char const* b);
bool operator== (std::string const& other) const;
bool operator!= (std::string const& other) const;
// other member functions
};

constexpr string_literal hello("hello");
void f(std::string const& s) {
if (s == hello) {
// do something
}
}

由于 string_literal 可以在编译时解析字符串文字以定位第一个空字符,我可以想象这些比较可以比比较 std::string 对字符串文字。但是,为了安全起见,hello 对象必须在静态初始化期间在运行时执行第一个构造函数时轻松构造:否则这些对象可能会在尚未访问时被意外访问,构造。

最佳答案

在 C++11 标准中,非局部变量的初始化顺序在第 3.6.2 节“非局部变量的初始化”中讨论。

首先执行静态初始化,然后执行动态初始化

静态初始化包括零初始化,然后是常量初始化。零初始化就像它听起来的那样。常量初始化是 C++11 中的新功能,§3.6.2/2 指定执行它

  • if each full-expression (including implicit conversions) that appears in the initializer of a reference with static or thread storage duration is a constant expression (5.19) and the reference is bound to an lvalue designating an object with static storage duration or to a temporary (see 12.2);
  • if an object with static or thread storage duration is initialized by a constructor call, if the constructor is a constexpr constructor, if all constructor arguments are constant expressions (including conversions), and if, after function invocation substitution (7.1.5), every constructor call and full-expression in the mem-initializers and in the brace-or-equal-initializers for non-static data members is a constant expression;
  • if an object with static or thread storage duration is not initialized by a constructor call and if every full-expression that appears in its initializer is a constant expression.

所以,第二点是 constexpr 对象可能被初始化的地方,作为静态初始化的最后一部分,如果一切都是 constexpr ,那么它基本上就会发生可以在编译时知道。

是的,作为静态初始化的一部分,这发生在动态初始化之前。

关于c++ - 什么时候构造 constexpr 对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20865354/

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