C ++:将字符串文字传递为字符串&导致编译失败,为什么

时间:2016-11-11 02:10:20

标签: c++ string char const literals

我正在使用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”可用于构造一个r值,临时std :: string对象。

对于g(),为什么它不能用于构造左值引用字符串&amp;,而const引用字符串&amp;好吗?

1 个答案:

答案 0 :(得分:3)

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

假设你正在使用g ++ 4.1.2

,那就是C ++ 03
  

§8.5.3[dcl.init.ref] / 5

     

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

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