什么时候constexpr实际上是一个constexpr

时间:2017-12-14 13:51:25

标签: c++ templates constexpr

说我有以下对象:

#include <string>

class Foo
{
public:
    constexpr Foo() {};
    constexpr std::string foo() const { return "foo"; }
};

这显然是错误的,std::string不是文字,不能从constexpr返回,编译器会抱怨这种效果。

但是,如果我将该对象作为模板并在我的程序中将其实例化为Foo<1>之类的任意对象,然后调用该函数,编译器甚至不会给我一个警告。

#include <string>

template <int N>
class Foo
{
public:
    constexpr Foo() {};
    constexpr std::string foo() const { return "foo"; }
};

在这种情况下模板化物体有什么特别之处? (海湾合作委员会4.9)

1 个答案:

答案 0 :(得分:1)

根据评论,this is ill-formed, and no diagnostic is required

由于规范不需要诊断来警告编写者,如果编写此代码,编译器 他们的代码应该能够在编译时进行评估,并以愉快的方式进行。

现在,如果你像我一样,你可能正在思考&#34;等等......为什么?这似乎是至少警告的完美案例,因为我所写的内容不会产生我期望的结果。&#34;

显然,这也是clang开发人员所想的,所以尽管这段代码可以根据法律规定干净地完成编译,但clang却抛出了全面的错误: