我尝试使用constexpr
引用进行初始化,但没有成功。我尝试了
#include <iostream>
constexpr int& f(int& x) // can define functions returning constexpr references
{
return x;
}
int main()
{
constexpr int x{20};
constexpr const int& z = x; // error here
}
但是我遇到了编译时错误
错误:常量表达式变量“z”必须由常量表达式初始化
删除const
会导致如下错误:
错误:将类型为“const int”的引用绑定到类型为“int”的值会丢失限定符
尽管我感觉在变量声明中使用constexpr
会自动意味着使用const
。
所以我的问题是:
constexpr
引用有用吗?(即比const
引用“更好”)- 如果是,如何有效地定义它们?
附注:我看到了一些与我的问题相关的问题,例如哪些值可以分配给`constexpr`引用?,但我认为它们没有解决我的问题。
static
或全局的。 - T.C.constexpr
影响的是引用而不是它所绑定的类型,因此要绑定到const int
,仍然需要一个const int&
。 - Jonathan Wakelymain
不应在程序内使用。main
的链接是实现定义的。 将main
定义为已删除或将其声明为“内联”,“静态”或“constexpr”的程序是非法的。名称main
没有其他保留意义。 - Caseymain
函数的返回类型与int
兼容,则从main
函数的初始调用返回等效于使用main
函数返回的值作为参数调用exit
函数...” [强调已添加]。这似乎意味着对main
的非初始调用是符合规范的。 - Caseystatic
变量,也可以是全局变量,或者是生存期延长到静态存储期的临时变量:static constexpr int const& x = 42;
是可以的。这也是为什么static constexpr auto x = {1,2};
被 clang++ 接受,但在块作用域中constexpr auto x = {1,2};
不被接受的原因。(这意味着甚至 OP 代码中的static constexpr const int& z = +x;
也是合法的。) - dyp