能否为constexpr函数定义类型别名?

8

在C++11或C++14中,我想定义一个类型别名来表示一个constexpr函数。

我尝试了:

#include <iostream>
constexpr int foo(int i, int j) { return i + j; }
using TConstExprFunction  = constexpr int (*)(int i, int j);

int main() {
  TConstExprFunction f = foo;
  constexpr int i = f(1, 2);
  std::cout << i << std::endl;
}

但是它无法使用g++和clang++编译。
g++: 错误:在“constexpr”之前需要类型说明符 clang++: 错误:类型名称不允许指定constexpr限定符 我必须按照下面的方式进行才能使其编译。
#include <iostream>
constexpr int foo(int i, int j) { return i + j; }
using TConstExprFunction  = int (*)(int i, int j);

int main() {
  constexpr TConstExprFunction f = foo;
  constexpr int i = f(1, 2);
  std::cout << i << std::endl;
}

从clang++的错误信息中看来,似乎我不能使用constexpr来定义类型名称。

那么,是否可以将类型别名定义为一个constexpr函数?如果可以,应该如何实现?


3
就像你不能在那里使用 static 一样... - Marc Glisse
“那么,有可能为 constexpr 函数定义一个类型别名吗?”你可以为其中一个定义类型别名。但是,你不能通过它像调用编译时常量表达式一样调用函数。你想要的效果是不可能的。” - Nicol Bolas
@MarcGlisse 这很有道理。 - Mine
2个回答

8
根据C++标准 7.1.5/p8 The constexpr specifier [dcl.constexpr]重点在此):

constexpr指定符对于constexpr函数或constexpr构造函数的类型没有影响。

另外,根据7 Declarations [dcl.dcl]
alias-declaration:
using identifier attribute-specifier-seqopt = defining-type-id ;

constexpr指示符不是函数类型的一部分。因此,您不能这样做:

using TConstExprFunction  = constexpr int (*)(int i, int j);

在使用TConstExprFunction =后,需要一个类型。


1

你不能将类型别名定义为constexpr函数。


C++标准不支持这个,有特定的原因吗? - Mine

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接