为什么对字符串参数的常量引用可以采用字符串文字?
Why can a const reference to a string parameter take string literals?
为什么对字符串参数的常量引用可以采用字符串文字?字符串文字,如"hello"
,不是变量,那么为什么这段代码有效呢?
class CVector {
public:
int x, y;
CVector() {};
~CVector() { delete ptr; }
string* ptr;
void doSomething(const string& str) { ptr = new string(str); }
void print() { cout << "n" << *ptr; }
};
int main()
{
result.doSomething("asdas");
result.print();
return 0;
}
首先,我认为引用作为参数用于避免复制过程并直接访问作为参数的变量(不过我仍然可以正确)。但是字符串文字"asdas"不是变量,那么为什么参数可以把字符串文字作为参数呢?我的意思是,由于参数str
是一个引用,它将成为该实体的别名,对吧?如果是这样,文字是否只是变成了一个变量?
参数列表不应该由string& str
而不是常量引用组成,以便文字将用于str
的构造?
只要引用处于活动状态,常量引用就不会使引用的实体保持活动状态吗?如果是这样,你为什么要对文字这样做?
当你这样做时
result.doSomething("asdas");
编译器会查看您是否有doSomething(const char[]);
,但什么也没找到。 由于没有合适的函数,它然后尝试找到一个重载,该重载需要可以从const char[]
构造的东西,并找到doSomething(const string& str)
。 由于编译器允许进行一个用户定义的转换,因此它从字符串文字构造一个临时std::string
,并通过引用 const 将该临时传递给函数。
参数列表不应该由string&str而不是const引用组成,以便在str的构造中使用文字吗?
不,这仅适用于对 const 的引用,不适用于常规引用,因为常规引用无法绑定到临时引用。
只要引用处于活动状态,常量引用就不会使引用的实体保持活动状态吗?如果是这样,你为什么要对文字这样做?
仅当对象是函数本地对象时,对 const 的引用才会延长对象的生存期。 在函数的作用域内,对象将处于活动状态,因为调用该函数的表达式尚未结束,但是如果您要尝试保留对类中std::string
的引用,则不起作用。
有效地将代码转换为
int main()
{
CVector result
{
std::string temp = "asdas";
result.doSomething(temp);
}
result.print();
return 0;
}
字符串文字,如"hello",不是变量
术语"变量"的定义非常模糊,没有任何具体概念的支持。
表达式"hello"
表示具有无法修改的静态存储持续时间的对象。像任何其他表达式一样,它可能用于初始化其他对象。在本例中,您将使用表达式初始化std::string
(在其衰减为const char*
之后)。
您缺少的是"中间步骤",即从该文字构造临时std::string
,然后通过绑定到引用const
来延长其生命周期。
所以,ish:
const std::string temp{"Hello world"}; // the compiler creates this transparently
const std::string& ref = temp; // this is yours, and it extends temp's life
有关详细信息,请阅读隐式转换。
std::string
有一个隐式const char *
转换构造函数。
编译器被允许进行一次隐式转换以使类型匹配,因此它使用所述 ctor 将const char *
转换为临时std::string
,并且从那里开始一帆风顺,因为const&
(常量左值引用)被允许绑定到临时(并延长它们的生命周期)。
- 我可以使用条件运算符初始化C风格的字符串文字吗
- 如何使用字符串文字作为宏参数
- 有没有办法从非C/C++文件中读取C++原始字符串文字的内容
- 构造<int>具有 2 个字符串文字的向量
- 初始化或分配空字符串文字到指向 C 中的 char 的指针或指向 C++ 中 const char 的指针的原因是什么
- 方便地对C++中的所有字符串文字进行模糊处理
- 比较 std::string 和 C 样式字符串文字
- 如何从char16_t字符串文字中读取双精度?
- 如果我在块中编写字符串文字,是否会从数据部分复制整个字符串数据?
- C++ 不能在cout中使用向量和字符串文字
- 为什么必须将 const 添加到 constexpr 中才能进行字符串文字声明?
- C++:Unicode 字符串文字的可移植性
- 返回空字符串文字 VS. 返回空点 - 它们是一样的吗?
- 确保字符指针始终指向相同的字符串文字
- 如何按照 Google C++风格指南连接字符串文字?
- 通过 constexpr 中的 'const char *' glvalue 访问字符串文字的值会出错
- 字符串文字到 char 数组的转换如何在C++中实际工作
- 另一个字符串文字,UDL 迷宫
- strlen 是否针对字符串文字进行了优化?
- 用户定义的字符串文字为字符串null终止