首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >正确的方法,类型铸造c++11风格?

正确的方法,类型铸造c++11风格?
EN

Stack Overflow用户
提问于 2016-04-27 13:05:50
回答 3查看 1.5K关注 0票数 3

我有这样一门课:

代码语言:javascript
复制
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)中,我收到了文字警告:

代码语言:javascript
复制
implicit conversion from int to size_type(aka unsigned long)

我想知道什么是正确的方法来消除这个警告?也许是这样的:

代码语言:javascript
复制
_data.resize(static_cast<decltype(_data)::size_type>(a)

注释:--我猜代码应该更改为:

代码语言:javascript
复制
init(size_t a) 

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-04-27 13:13:10

您的示例使用了正确的方法:

  1. 它明文规定要投人。
  2. 它转换为正确的类型,并且不受未来_data类型更改的影响。
  3. 它使用的是正确的演员阵容。

所以,如果改变界面是没有问题的,那就坚持下去吧。

在使用之前,最好为输入添加是否正确的检查。在将负值转换为无符号之前检查它是最基本和最有用的。

票数 7
EN

Stack Overflow用户

发布于 2016-04-27 13:16:06

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

代码语言:javascript
复制
_data.resize(static_cast<decltype(_data)::size_type>(a));

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

代码语言:javascript
复制
_data.resize(static_cast<unsigned int>(a));
票数 4
EN

Stack Overflow用户

发布于 2016-04-27 13:13:36

就这么简单:

代码语言:javascript
复制
_data.resize(std::size_t(a));

像这样疯狂:

代码语言:javascript
复制
_data.resize(static_cast<std::size_t>(a));

C风格的强制转换也支持:

代码语言:javascript
复制
_data.resize((std::size_t)a);
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36890739

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档