以 c++11 样式键入转换的正确方法

Correct way to type casting in c++11 style?

本文关键字:方法 转换 c++11 样式      更新时间:2023-10-16

我有这样的类:

class A {
    void init(int a){
    _data.resize(a); //! (1)
    }
    //other parts of the code are not important ...
private:
    std::list<std::vector<double>> _data;
}

在(1)中,我收到带有文本的警告:

implicit conversion from int to size_type(aka unsigned long)

我想知道摆脱该警告的正确方法是什么?也许是这样的:

_data.resize(static_cast<decltype(_data)::size_type>(a)

注意:我想代码应该更改为:

init(size_t a) 

但是让我们假设我们不能更改类接口。

您的示例强制转换以正确的方式执行此操作:

  1. 它明确表示有意投射。
  2. 它强制转换为正确的类型,并受到保护,不会在将来发生_data类型更改。
  3. 它使用正确的演员阵容。

所以坚持下去,如果改变界面是不可能的。

最好在使用输入

之前为输入添加健全性检查。在将其转换为无符号之前检查负值是最基本和最有用的方法。

最正确的方法是如你所说:

_data.resize(static_cast<decltype(_data)::size_type>(a));

但是最大的问题是签名unsigned,你说你被int困住了,所以你使用:

_data.resize(static_cast<unsigned int>(a));

就这么简单:

_data.resize(std::size_t(a));

像这样疯狂:

_data.resize(static_cast<std::size_t>(a));

还支持 C 样式转换:

_data.resize((std::size_t)a);