标签: constinit

什么是C ++ 20中的“ constinit”?

constinitP1143中提出的C ++ 20中的新关键字说明

标准中提供了以下示例:

const char * g() { return "dynamic initialization"; }
constexpr const char * f(bool p) { return p ? "constant initializer" : g(); }
constinit const char * c = f(true);     // OK
constinit const char * d = f(false);    // ill-formed
Run Code Online (Sandbox Code Playgroud)

我想到了几个问题:

  • 什么constinit意思 为什么要引入?在什么情况下我们应该使用它?

  • 它使变量不可变吗?是暗示const还是constexpr

  • 变量可以是constconstinit吗?怎么样constexprconstinit

  • 可以将说明符应用于哪些变量?为什么我们不能将其应用于staticthread_local变量?

  • 有性能优势吗?

该问题旨在作为 …

c++ c++20 constinit

24
推荐指数
1
解决办法
1017
查看次数

何时调用 constinit 对象的析构函数?

一般说静态对象的析构函数是以与构造函数相反的顺序调用的。据我了解,constinit 对象是在编译时初始化的,因此它们的析构函数应该在“普通”静态对象的析构函数之后调用。

该程序

struct A
{
  constexpr A(const char* t): t_(t) {}
  ~A() {std::cout << "~A(" << t_ << ")\n";} 
  const char* t_;
};  

static A a1("static");  

int main () {
   static constinit A a2("constinit");  
   return 0;
} 
Run Code Online (Sandbox Code Playgroud)

(使用 GCC 10),但是,给出输出

~A(constinit)
~A(static)
Run Code Online (Sandbox Code Playgroud)

即 constinit 对象在“正常”静态对象之前被销毁(尽管它是更早构造的)。“逆序”规则对 constinit 对象不再有效吗?

c++ destructor initialization-order c++20 constinit

6
推荐指数
1
解决办法
98
查看次数

C++20 `constinit` 可以放弃对漂亮计数器习惯用法的需要吗?

C++20 的引入constinit是为了避免静态初始化顺序惨败。

可以放弃对漂亮计数器习惯用法constinit的需要(例如,初始化)吗?std::cout

c++ static-order-fiasco c++20 constinit

4
推荐指数
1
解决办法
223
查看次数

“constinit”和“constexpr”之间的真正区别是什么?

constexpr int f() { return 0; }
int g() { return 0; }

constexpr auto c1 = f(); // OK
constinit auto c2 = f(); // OK

constexpr auto d1 = g(); // ill-formed
constinit auto d2 = g(); // ill-formed

int main() {}
Run Code Online (Sandbox Code Playgroud)

如上面的代码所示,我找不到constinit和之间的任何区别constexpr

constinit和之间的真正区别是constexpr什么?


更新:

有关什么是constinit用C ++ 20?没有明确规定之间的差异constinitconstexpr

c++ constexpr semantics c++20 constinit

4
推荐指数
1
解决办法
149
查看次数

使用 constinit const 时 static_assert 失败。constinit、constinit const、constexpr、const、非常量变量中的混淆

我有一个关于编译时函数的问题。我知道 static_assert 应该只适用于可以在编译时评估/计算的类型。所以它不适用于 std::string (然而,gcc10 中不支持 constexpr std::string)但可以使用 std::array(当我在编译时知道大小时)。我正在观看 Jason Turner 的 C++ Weekly,所以这个片段来自这一集https://www.youtube.com/watch?v=INn3xa4pMfg

代码在这里:https : //godbolt.org/z/e3WPTP

#include <array>
#include <algorithm>

template<typename Key, typename Value, std::size_t Size>
struct Map final
{
    std::array<std::pair<Key, Value>, Size> _data;

    [[nodiscard]] constexpr Value getMappedKey(const Key& aKey) const
    {
        const auto mapIterator = std::ranges::find_if(_data, [&aKey](const auto& pair){ return pair.first == aKey;});

        if(mapIterator != _data.end())
        {
            return mapIterator->second;
        }
        else
        {
            throw std::out_of_range("Key is not in the map");
        }
    }
};

enum class OurEnum …
Run Code Online (Sandbox Code Playgroud)

c++ constexpr c++20 constinit

0
推荐指数
1
解决办法
153
查看次数