You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 02:15:38