C++ 为什么不是';t abs constexpr?

C++ 为什么不是';t abs constexpr?,c++,c++11,constexpr,C++,C++11,Constexpr,在中,自C++11以来,存在重载: std::intmax_t abs( std::intmax_t n ); std::intmax_t imaxabs( std::intmax_t n ); 为什么这两个函数不是constepr?我不能给出一个好的理由来解释为什么abs不能是constepr,显然也不能是gcc。当我将gcc 4.9.2用于此程序时: #include <cstdlib> #include <cinttypes> #include <casse

中,自C++11以来,存在重载:

std::intmax_t abs( std::intmax_t n );
std::intmax_t imaxabs( std::intmax_t n );

为什么这两个函数不是
constepr

我不能给出一个好的理由来解释为什么
abs
不能是
constepr
,显然也不能是
gcc
。当我将
gcc 4.9.2
用于此程序时:

#include <cstdlib>
#include <cinttypes>
#include <cassert>

constexpr intmax_t abs3 = std::abs(3);
constexpr intmax_t absneg3 = std::abs(-3);
int main()
{
    assert(abs3 == absneg3);
}
#包括
#包括
#包括
constexpr intmax_t abs3=std::abs(3);
constexpr intmax_t absneg3=std::abs(-3);
int main()
{
断言(abs3==absneg3);
}
它编译并运行到完成,没有任何警告或错误。你可以。但是,
clang++
(3.5.0版)会引发编译时错误:

abs.cpp:6:20:错误:constexpr变量“abs3”必须由常量表达式初始化

我认为,
clang++
实际上就在这里,因为在2011标准的第27.9.2节[c.files]中,它说:

标头的内容与标准C库标头相同,但有以下更改:

-标题包括标题,而不是,以及

-当且仅当intmax_t类型指定扩展整数类型(3.9.1)时,以下函数 新增签名:

intmax_t abs(intmax_t)

imaxdiv_t div(intmax_t,intmax_t)

其语义应与函数签名intmax_t imaxabs(intmax_t)和 分别为imaxdiv\u t imaxdiv(intmax\u t,intmax\u t)

<>在C++标准中,如在已发布的2014版本中,在第7.6 5.6节[CONTXPR.FUNCTION]中表示:

本标准明确要求某些标准库函数为constexpr(7.1.5)。实现不应将任何标准库函数签名声明为constexpr,除非 是明确要求的


因此,目前的结果是,根据标准(您知道),这些函数仍然不是
constexpr
,但它们可能是,正如
gcc
编译器所证明的那样。

我无法给出一个很好的理由来解释为什么
abs
不能是
constexpr
,显然
gcc
也不能。当我将
gcc 4.9.2
用于此程序时:

#include <cstdlib>
#include <cinttypes>
#include <cassert>

constexpr intmax_t abs3 = std::abs(3);
constexpr intmax_t absneg3 = std::abs(-3);
int main()
{
    assert(abs3 == absneg3);
}
#包括
#包括
#包括
constexpr intmax_t abs3=std::abs(3);
constexpr intmax_t absneg3=std::abs(-3);
int main()
{
断言(abs3==absneg3);
}
它编译并运行到完成,没有任何警告或错误。你可以。但是,
clang++
(3.5.0版)会引发编译时错误:

abs.cpp:6:20:错误:constexpr变量“abs3”必须由常量表达式初始化

我认为,
clang++
实际上就在这里,因为在2011标准的第27.9.2节[c.files]中,它说:

标头的内容与标准C库标头相同,但有以下更改:

-标题包括标题,而不是,以及

-当且仅当intmax_t类型指定扩展整数类型(3.9.1)时,以下函数 新增签名:

intmax_t abs(intmax_t)

imaxdiv_t div(intmax_t,intmax_t)

其语义应与函数签名intmax_t imaxabs(intmax_t)和 分别为imaxdiv\u t imaxdiv(intmax\u t,intmax\u t)

<>在C++标准中,如在已发布的2014版本中,在第7.6 5.6节[CONTXPR.FUNCTION]中表示:

本标准明确要求某些标准库函数为constexpr(7.1.5)。实现不应将任何标准库函数签名声明为constexpr,除非 是明确要求的


因此,目前的结果是,根据标准(您知道),这些函数仍然不是
constexpr
,但它们可能是,正如
gcc
编译器所证明的那样。

简单的解释可能是,没有人检查标准库中列出的每个函数,并更新了条目,使其成为
constexpr


更新标准是一个涉及人类努力提出变更并使这些变更得到审查和接受的过程。这意味着,当添加一个新功能时,
constexpr
是一个新功能,并不是所有其他功能都会自动更新以使用该功能。这一特殊情况很可能会在标准的未来演变中得到更新——如果一些人承担起提出一系列变更的任务(通常是吃力不讨好的任务),另一些人则承担起审查该变更的任务,并说服在委员会中有投票权的人接受它。

简单的解释可能是,没有人检查标准库中列出的每个函数,并更新条目使其成为
constexpr

更新标准是一个涉及人类努力提出变更并使这些变更得到审查和接受的过程。这意味着,当添加一个新功能时,
constexpr
是一个新功能,并不是所有其他功能都会自动更新以使用该功能。这一特殊情况很可能会在标准的未来演变中得到更新——如果一些人承担起提出一系列变更的任务(通常是吃力不讨好的任务),另一些人则承担起审查该变更的任务,并说服委员会中有投票权的人接受该变更。

该变更是在:

应声明
中的函数
constexpr
当且仅当:

  • 当作用于有理数集时, 函数关闭(除零外)
  • 函数不修改其任何参数 具有外部可视性
  • 该函数并不强烈依赖于 舍入模式
  • 通过简要说明,
    abs
    满足所有三个标准;但是,诸如
    exp