Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/190.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么数字_限制<;原子<;X>&燃气轮机;不是不编译吗?_C++_Atomic_Decltype - Fatal编程技术网

C++ 为什么数字_限制<;原子<;X>&燃气轮机;不是不编译吗?

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();

我刚刚创建了一个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()
它生成我想要的值,即
std::numeric\u limits::max()


我的问题是为什么
std::numeric\u limits
甚至被编译?它不应该像
std::numeric\u limits
那样失败吗


如果这是设计的,为什么
max()
0?

这是默认行为。从

  • 对于
    数值限制
    模板中声明为static constexpr的所有成员,专门化应以可作为常量表达式使用的方式定义这些值
  • 默认的
    数值限制
    模板应具有所有成员,但具有
    0
    false
  • 应为每种算术类型(浮点和整数,包括布尔)提供专门化。对于
    数值限制的所有此类专门化
    ,成员
    为专门化
    应为
  • 合格cv类型cv
    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之前编写泛型代码可能会更容易