C++ 为什么数字_限制<;原子<;X>&燃气轮机;不是不编译吗?
我刚刚创建了一个bug,根据以下表达式测试了一个值:C++ 为什么数字_限制<;原子<;X>&燃气轮机;不是不编译吗?,c++,atomic,decltype,C++,Atomic,Decltype,我刚刚创建了一个bug,根据以下表达式测试了一个值: std::numeric\u limits::max() 在此上下文中,allocationCount是一个std::atomic 显然,上述表述: #包括 #包括 #包括 #包括 静态std::原子分配计数=0; uint64_t buggyGetMax(){ 返回std::numeric_limits::max(); } uint64\u t correctGetMax(){ 返回std::numeric_limits::max();
std::numeric\u limits::max()
在此上下文中,allocationCount
是一个std::atomic
显然,上述表述:
#包括
#包括
#包括
#包括
静态std::原子分配计数=0;
uint64_t buggyGetMax(){
返回std::numeric_limits::max();
}
uint64\u t correctGetMax(){
返回std::numeric_limits::max();
}
我想用的是
std::numeric\u limits::max()
它生成我想要的值,即std::numeric\u limits::max()
我的问题是为什么
std::numeric\u limits
甚至被编译?它不应该像std::numeric\u limits
那样失败吗
如果这是设计的,为什么
max()
0?这是默认行为。从
数值限制
模板中声明为static constexpr的所有成员,专门化应以可作为常量表达式使用的方式定义这些值数值限制
模板应具有所有成员,但具有0
或false
值数值限制的所有此类专门化
,成员为专门化
应为真
T
上的numeric\limits
专业化的每个成员的值应等于不合格cv类型T
上的相应专业化成员的值复杂
,不应具有专门化std::atomic
是非算术类型,根据第6段,它不应具有专门化,这意味着第3段开始发挥作用,您得到的所有值都将是0
或false
std::numeric\u limits
在没有专门化T
时具有默认实现
因此,当T=std::string
和T=std::atomic
时,std::numeric\u limits
仍能正常编译,它只会报告默认值
但是,在返回
uint64\u t
的buggyGetMax()
函数内部,返回std::numeric\u limits::max()
将不会编译,因为max()
返回一个空的std::string
,它不会隐式转换为uint64\u t
。但是std::atomic
会隐式转换为uint64\u t
,这就是返回std::numeric\u limits::max()
编译的原因。它只是不会返回您期望的值。您有没有一个std::numeric\u limits
失败的例子?它在NathanOliver工作得很好;)我懂了。我想我只是假设numeric_limits不会默认为任何东西,只有在专门化的情况下才编译。关于为什么会出现全零违约,有什么解释吗?@BernardoSulzbach我不知道为什么会做出这个决定。因为C++98/03没有附带,所以在C++11之前编写泛型代码可能会更容易