gpt4 book ai didi

c++ - 赋值与初始化期间的类型安全

转载 作者:太空宇宙 更新时间:2023-11-04 16:00:47 25 4
gpt4 key购买 nike

初始化列表语法的优点之一是它通过禁止 narrowing conversions 提高了类型安全性:

int x {7.9};   // error: narrowing
int y = 7.9; // OK: y becomes 7. Hope for a compiler warning

但是,AFAIK 无法在后续分配中强制执行相同的检查:

int z {7};
z = 7.9; // allows narrowing, and no other syntax available

为什么语言设计对初始化期间的类型安全比赋值期间的类型安全给予更多关注?缩小分配范围是否不太可能导致错误和/或更难检测?

最佳答案

如果x是一个int变量,那么

x = 7.9;

出于向后兼容性的原因,必须继续在 C++11 及更高版本中工作。即使 x 被大括号初始化也是如此。大括号初始化的 int 变量与非大括号初始化的 int 变量具有相同的类型。如果您通过引用函数传递 x

void f(int& r);
f(x);

然后在 f 的主体中将无法“告诉”该对象是否已被大括号初始化,因此该语言不能对其应用不同的规则。

您可以通过以下方式自行防止缩小转化范围:

x = {7.9};  // error

您还可以通过创建一个不允许缩小赋值的 int“包装器”类型来尝试利用类型系统:

struct safe_int {
template <class T> safe_int(T&& x) : value{std::forward<T>(x)} {}
template <class T> safe_int& operator=(T&& x) {
value = {std::forward<T>(x)}; return *this;
}
operator int() const { return value; }
int value;
};

不幸的是,这个类在任何情况下都不能表现得像一个实际的 int 对象。

关于c++ - 赋值与初始化期间的类型安全,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44885143/

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