在非constexpr函数上添加的constexpr限定词不会触发任何警告

时间:2018-08-01 14:22:37

标签: c++ function c++11 constexpr

似乎在将constexpr限定符添加到非constexpr函数时,编译器会忽略它。这是为什么?

以下代码可以正常运行。

#include <iostream>
#include <string>
using std::string; using std::cout; using std::endl;

constexpr bool is_shorter(const string &lft, const string &rht) // this is not a constexpr function
{
    return lft.size() < rht.size();
}

int main()
{
    bool restul =  is_shorter("Hello", "World!");
    return 0;
}

1 个答案:

答案 0 :(得分:3)

发生这种情况的原因是因为标准允许这样做。 [dcl.constexpr]/5状态

  

对于既没有默认值也没有模板的constexpr函数或constexpr构造函数,如果不存在任何参数值,使得对该函数或构造函数的调用可以是核心常量表达式(8.20)的评估子表达式,或者对于构造函数,某些对象的常量初始化器(6.6.2),程序格式错误,无需诊断。

因此,由于该函数永远不能是核心常量表达式,因此行为是不确定的,并且不需要编译器通知您。