为何C++中字符串字面量不是右值?代码调用差异解析
为什么字符串字面量能绑定到非const左值引用,而整数字面量1不行?
先看这段代码:
void test(auto& arg){} int main(){ test("bla"); test(1); }
调用test(1)时会触发编译错误,报错信息如下:
main.cpp: In function 'int main()': main.cpp:50:14: error: cannot bind non-const lvalue reference of type 'int&' to an rvalue of type 'int' 50 | test(1); | ^ main.cpp:37:17: note: initializing argument 1 of 'void test(auto:1&) [with auto:1 = int]' 37 | void test(auto& arg){}
但test("bla")却能正常编译,核心原因是两者的表达式属性和类型完全不同:
- 整数字面量
1是右值:它属于纯右值(prvalue),没有持久的内存地址,只是一个临时生成的值。C++规则明确禁止将非const的左值引用(比如int&)绑定到这类右值,因此编译器报错。 - 字符串字面量
"bla"是左值:它的实际类型是const char[4](包含末尾的空终止符),编译器会把字符串字面量存储在程序的只读数据段中,是一个拥有固定内存地址的持久对象,属于左值表达式。当传入test(auto& arg)时,auto会推导为const char[4],参数类型变为const char(&)[4](数组的左值引用),左值可以正常绑定到对应的左值引用上,因此不会触发错误。
内容的提问来源于stack exchange,提问作者Stein
相关产品推荐
相关产品推荐

