gpt4 book ai didi

C++11:赋值运算符是否会阻止类型被 POD,从而被全局初始化?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:14:50 26 4
gpt4 key购买 nike

背景:我在一个大型代码环境中,其中运行全局构造函数的未定义顺序存在问题。所以我有一个自定义类,旨在延迟初始化直到首次使用。它所有的魔力都发生在它的 operator* 和 operator-> 函数中;它们是唯一定义的东西。它还在自身内部存储一些状态,以供自动初始化功能使用。当然,那个状态必须是 POD,这样整个类都是 POD,这样它就可以在任何人的代码开始运行之前就完全设置好,这样所有的代码都可以在任何地方使用所有的全局变量,而不用担心全局变量没有'尚未设置。

前段时间有人添加了一个私有(private)的、从未定义的赋值运算符,这样该类型就永远不会被分配给(无论如何它都不会被设计成永远改变)。现在有人说这门课坏了,因为它不是 POD。如果不是声明但未定义,而是将其声明为“=delete”,我认为这样会更好。事实上,随着这种变化,std::is_pod<>​​::value 为该类型返回 true。

但是 as 赋值运算符会阻止类型成为 POD 吗?我认为要求只是它必须只有公共(public)数据成员,没有虚拟方法,也没有构造函数或析构函数。

更重要的是我的情况:从未定义的赋值运算符的存在是否会阻止类在全局初始化时与所有其他全局 POD 一起被初始化?

简化示例:

struct LazyString {
const char *c_str;

bool has_been_inited;
string *lazy_str_do_not_use_directly;

string &operator*() { return *get(); }
string *operator->() { return get(); }

private:
string *get() {
// The real code uses a mutex, of course, to be thread-safe.
if (!has_been_inited) {
lazy_str_do_not_use_directly = new string(c_str);
has_been_inited = true;
}
return lazy_str_do_not_use_directly;
}

// Does this make the class non-POD?
// If so, does that mean that global variables of this type
// will not be initialized at global-initialization time, that wonderful
// moment in time where no code has yet been run?
void operator=(const LazyString&);

// If I do this instead, it breaks C++03 compatibility, but is this somehow better?
void operator=(const LazyString&) = delete;
};

LazyString lazy = { "lazy" };

int main(int argc, char *argv[]) {
std::cout << *lazy;
}

最佳答案

Does an assignment operator prevent a type from being POD

是的。 POD 类型必须普通;所以必须是简单可复制的;因此必须没有非平凡的复制或移动赋值运算符。

任何用户提供的运算符都是非平凡的,因此声明复制构造函数会使类非平凡,因此非 POD。

and thus being global-initialized?

没有。任何可实例化的类型,无论是否为 POD,都可以是全局变量。

更新:从评论中,你想问:

Can it be statically, rather than dynamically, initialised?

是的,因为它有一个简单的构造函数;只要初始化程序是常量表达式。在您的示例中,{ "lazy"} 是一个常量表达式,因此 LazyString 可以静态初始化。

这里的重要特征是它有一个简单的构造函数,而不是 POD。 POD 意味着它还满足与初始化无关的各种其他要求。

关于C++11:赋值运算符是否会阻止类型被 POD,从而被全局初始化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26044494/

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