constinit是P1143中提出的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?
变量可以是const和constinit吗?怎么样constexpr和constinit?
可以将说明符应用于哪些变量?为什么我们不能将其应用于static非thread_local变量?
有性能优势吗?
该问题旨在作为 …
一般说静态对象的析构函数是以与构造函数相反的顺序调用的。据我了解,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 对象不再有效吗?
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?没有明确规定之间的差异constinit和constexpr。
我有一个关于编译时函数的问题。我知道 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)