gpt4 book ai didi

c++ - 将整数文字初始化为 std::size_t

转载 作者:IT老高 更新时间:2023-10-28 12:46:28 30 4
gpt4 key购买 nike

有一些已知的方法可以操作整数文字的类型

0L;  // long
3U; // unsigned integer
1LL; // long long

我需要一种将整数文字初始化为 std::size_t 的方法.我以为这样做了

2U; // unsigned int

就够了,但是在调用需要两个相同整数类型的参数的函数模板时,我仍然会遇到编译器错误(没有匹配的函数来调用 func(unsigned int, size_t)

我知道/验证了显式转换 (static_cast<std::size_t>(1)) 第一个参数可以解决问题,但我想问是否有更漂亮的解决方案

编辑

函数有签名

template <class T> const T& func(const T& a, const T& b);

EDIT2

我不知道这个问题是否值得“责备”,但我很高兴地宣布 this is upcoming (感谢@malat 在评论中提到这一点)

最佳答案

没有这样的标准设施。 C99 和 C++11 实现在 <stdint.h> 中确实有这样的宏/<cstdint> .但即使在那里,宏也只为 stdint.h 定义。类型,不包括 size_t .

could定义一个用户定义的文字操作符:

constexpr std::size_t operator "" _z ( unsigned long long n )
{ return n; }

auto sz = 5_z;
static_assert( std::is_same< decltype( sz ), std::size_t >::value, "" );

constexpr必须在数组边界中使用它 int arr[ 23_z ]case 9_z:标签。

大多数人可能会认为缺少宏是一种优势:)。


抛开可爱,最好的方法是使用大括号初始化:std::size_t{ 42 } .这不等于 std::size_t( 42 )这就像一个讨厌的 C 转换——大概是你用 static_cast 避免的。 .恰恰相反:大括号要求里面的值在目标类型中是完全可表示的。所以,char{ 300 }std::size_t{ -1 }都是不正确的。

大括号和括号看起来很相似,但在初始化临时对象时,它们在安全方面是截然相反的。大括号比文字运算符更安全,因为与函数不同,它们可以区分编译时值。

关于c++ - 将整数文字初始化为 std::size_t,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22346369/

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