我有以下代码
constexpr int into(int a,int b)
{
int c=a*b;
return c;
}
int main()
{
constexpr int &n=into(5,5);
}
我已经阅读了(MSDN)
关键字<code>constexpr</code>在C 11中引入,并在C 14中进行了改进。它表示常量表达式。与<code>const</code>一样,它可以应用于变量,因此如果任何代码试图修改值,就会引发编译器错误。
阅读后,我认为可以使用constexpr
代替const
,但是对于上面的代码,我收到一个编译器错误,指出
`int main()':
invalid initialization of non-const reference of type 'int&' from an rvalue of type 'int'`
当 constexpr
被 const
替换时,它可以正常工作。我不理解这种行为;有人能说出一些光芒吗?
标记为< code>constexpr的表达式将在编译时解析,这将把< code>into(5,5)的结果视为< code>int文字。众所周知,在C中引用不能绑定到< code>int文字。
您可以通过使在全局范围内并在主范围内显示
在调用
出现在全局范围内并在main中创建对main
之前强制解析x
,然后允许将引用绑定到x
来实现此工作。x
的const
引用:
constexpr int into(int a,int b) {
int c=a*b;
return c;
}
// guaranteed to be resolved before main is called
constexpr int x = into(5,5);
int main() {
constexpr const int& n = x;
static_assert(n == 25, "whoops!");
}
为了具体回答您的问题,这与右值或移动语义学完全正交,而是
的细微差别。
如果全局作用域让您感到心痛,那么您可以将
x
也设置为static
,并将其初始化放在引用绑定之前,这在我看来更自然:
constexpr int into(int a,int b) {
int c=a*b;
return c;
}
int main() {
// guaranteed to be resolved before main is called
static constexpr int x = into(5,5);
constexpr const int& n = x;
static_assert(n == 25, "whoops!");
}
与应用于int
的const
不同,constexpr
关键字将const直接应用于引用类型int>的变量
typedef int &int_ref;
int main() {
int x = 1;
int &a = x; // OK
int_ref b = x; // OK, int_ref is 'int &'
const int &c = 1; // OK, reference to const int
const int_ref d = 1; // error: type of d is 'int &'
// qualifier on reference are being ignored
}
< code>constexpr int
编译此代码会给出“错误:将'const int'绑定到'int类型的引用
问题内容: 以下语句: 因错误而失败: 为什么在这里需要演员表? 我发现了几篇文章,解释了为什么您不能进行反向操作(将T分配给a),但这是显而易见的(可以理解)。 注意:我在Eclipse Luna下对此进行编码,所以我不知道这是Luna Quirk还是泛型中确实不了解的东西。 问题答案: 协方差vs协方差vs不变性 是 不变的 。 结果是, 是 不是一个亚型 的 在Java中,变量可以保存 相同
问题内容: 有关语法的简单问题。为什么限制这样的表达式: 并只允许以下内容: ? 问题答案: 这是因为方法引用或lambda表达式的目标类型应该是功能接口。仅基于此,运行时将创建提供给定功能接口的实现的类的实例。将lambda或方法引用视为概念。将其分配给功能接口类型将赋予其具体含义。 此外,特定的lambda或方法引用可以具有多个功能接口作为其目标类型。例如,考虑以下lamda: 这个lambd
当您尝试在中使用Constexpr时,如下所示: gcc和clang投诉: 错误:无法将::main声明为内联 错误:'main'不允许声明为constexr 让我们看看constexpr函数的要求是什么: constexpr函数必须满足以下要求: 它必须不是虚拟的 它的返回类型必须是文学类型 它的每个参数都必须是文字类型 什么是文学类型? 文字类型是以下任一类型 void(自c 14起) 功能体
以下代码编译确定: 但是嵌套列表不会: 这是为什么?如果我需要这样做,“正确”的方法是什么? 用例是我有一个方法,它返回许多不同集合中的一个,其中元素类型本身是泛型的,每个可能的返回值都有不同的定义类型,其中返回值取决于传入的参数。目前,作为一种解决方法,我将结果分配给一个变量,其中类型是带有通配符的集合类型(即<code>列表
问题内容: 我试图为对象类型分配一个lambda: 它给我一个错误的说法: 为什么会这样,怎么做? 问题答案: 这是不可能的。根据错误消息不是功能接口,即具有单个公共方法的接口,因此您需要使用引用类型,例如