【问题标题】:C++: Pass string literal as a string& leads to compilation failure, whyC ++:将字符串文字作为字符串传递&导致编译失败,为什么
【发布时间】:2016-11-11 02:10:19
【问题描述】:

我正在使用 g++4.1.2 编译这个:

    cat 1.cpp
#include<iostream> 
#include<string> 
using namespace std; 
void f(const string& s){} 
void g(string& s){} 
void h(string s){} 
int main() 
{ 
    string s="abc"; 
    f("abc"); 
    g("abc”);//Error 
    h("abc"); 
    return 0; 
} 

在“g();”行失败

$ g++ 1.cpp 
1.cpp: In function ‘int main()’: 
    1.cpp:11: error: invalid initialization of non-const reference of type ‘std::string&’ from a    temporary of type ‘const char*’ 
1.cpp:5: error: in passing argument 1 of ‘void g(std::string&)’ 

我不太明白,只要“abc”可以是std::string的构造函数参数:

对于f(),“abc”可以用来构造一个字符串(const char*),作为对字符串的const引用

对于 h(),“abc”可用于构造一个右值的临时 std::string 对象。

对于g(),为什么不能用来构造左值引用字符串&,而const引用字符串&可以?

【问题讨论】:

  • 你在g调用中使用了一个奇怪的引号......它应该是"
  • 总之,左值引用不能绑定到临时的。

标签: c++ string char constants literals


【解决方案1】:

那是因为语言规则是这样设计的。您可以将右值绑定到 const 左值引用(并将其生命周期延长到引用的生命周期),因为它是明确允许的。

假设 C++03,因为您使用的是 g++ 4.1.2

§ 8.5.3 [dcl.init.ref] / 5

对类型“cv1T1”的引用由类型表达式初始化 “cv2T2”如下:

  • 如果初始化表达式
    • 是一个左值(但不是位域),并且“cv1T1”与“cv2T2”引用兼容,或者
    • 具有类类型(即 T2 是类类型)并且可以隐式转换为 [...] 类型的左值
  • 否则,引用应为非易失性 const 类型 [...]
    • 如果初始化表达式是右值,具有 T2a 类类型,并且“cv1T1”与“cv2T2”引用兼容,[...]
    • 否则,将使用非引用规则从初始化表达式创建并初始化“cv1T1”类型的临时变量 复制初始化(8.5)。 然后将引用绑定到 临时的。

【讨论】:

    猜你喜欢
    • 2011-03-30
    • 1970-01-01
    • 2014-04-30
    • 2010-10-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多