- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
考虑:
void foo(std::string& s);
在这个函数内部,表达式
s
是左值
std::string
(不是
std::string&
),因为引用在表达式中并不真正“存在”:
[expr.type/1]
: If an expression initially has the type “reference toT
” ([dcl.ref], [dcl.init.ref]), the type is adjusted toT
prior to any further analysis. The expression designates the object or function denoted by the reference, and the expression is an lvalue or an xvalue, depending on the expression. [..]
const std::string& foo(const std::string& s1, const std::string& s2)
{
return (s1.size() < s2.size() ? s1 : s2);
}
关于这里的条件运算符是否涉及创建临时的另一个问题存在争论(这会对
foo
作为悬空引用的返回值产生影响)。
[expr.cond/5]
: If the second and third operands are glvalues of the same value category and have the same type, the result is of that type and value category and it is a bit-field if the second or the third operand is a bit-field, or if both are bit-fields.
[expr.cond/7.1]
: The second and third operands have the same type; the result is of that type and the result object is initialized using the selected operand.
std::string
来自
std::string
涉及拷贝。
foo
确实确实传播了所选参数的引用语义:
#include <string>
#include <iostream>
using std::string;
using std::cout;
void foo(string& s1, string& s2)
{
auto& s3 = (s1.size() < s2.size() ? s1 : s2);
s3 = "what";
}
int main()
{
string s1 = "hello";
string s2 = "world";
foo(s1, s2);
cout << s1 << ' ' << s2 << '\n'; // Output: hello what
}
(
live demo)
s2
, 通过引用传递到
foo
, 已被条件运算符选中,然后绑定(bind)到
s3
, 并修改。没有证据表明正在进行任何复制。
const std::string
类型的左值表达式。 (不是引用!)const std::string
, 也是 const std::string
,所以它是 const std::string
从 const std::string
初始化最佳答案
从您引用的那部分开始:
If the second and third operands are glvalues of the same value category and have the same type, the result is of that type and value category and it is a bit-field if the second or the third operand is a bit-field, or if both are bit-fields.
std::string const
类型的左值,所以结果是类型为
std::string const
的左值.
Initialising a
std::string
from astd::string
involves a copy.
std::string
来自
std::string
.在:
const std::string& foo(const std::string& s1, const std::string& s2)
{
return (s1.size() < s2.size() ? s1 : s2);
}
我们正在初始化
std::string const&
来自
std::string const
类型的左值.这只是一个直接引用绑定(bind)。无需复制。
关于c++ - C++ 不是强制要求 (cond ? string_1 : string_2) initialize a string?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63198098/
我是一名优秀的程序员,十分优秀!