gpt4 book ai didi

c++ - 构造字符串 ("Plain Old C chain") 是右值吗?

转载 作者:IT老高 更新时间:2023-10-28 21:39:01 25 4
gpt4 key购买 nike

我想知道在调用 foo(string) 时是否进行了复制省略以下。(注:foo(string) 属于我无法更改的接口(interface))。

为此我尝试检查是否构造了 string("Hello world!")rvalue .

我搜索了如何以编程方式执行此操作并找到了这篇文章:How to determine programmatically if an expression is rvalue or lvalue in C++?

void foo( string str)
{
cout << str << endl;
}

int main()
{
foo("Hello world!");
cout << is_rvalue_reference<decltype(string("Hello world!"))>::value << endl;
}

结果是

Hello world!
0

我以为我会得到 trueis_rvalue_reference< xxx >::value

  • 我哪里错了?
  • string("Hello world!")可能是 rvalue但似乎不是“任何类型的引用”(lvaluervalue、通用 ...)所以我得到了 false结果。有没有办法获得 true回答 rvalue ?
  • 他的示例中是否存在复制省略?

最佳答案

  • Where am I wrong?

std::string("") 是一个右值,但 decltype(std::string("")) 不是一个右值引用。 std::string 对象的类型当然是... std::string

您有一个类别错误。右值是一种表达式,右值引用是一种类型。

临时 string 对象是一个右值。 string&& 类型是右值引用类型。

您的 decltype 表达式对于您正在尝试做的事情没有用处。考虑:

std::string s;
using type1 = decltype(s);
using type2 = decltype(std::string(""));
static_assert(std::is_same<type1, type2>::value, "same");

在这两种情况下,decltype 给出相同的类型:std::string。这是因为 decltype 告诉您类型,而不是值类别(即表达式是右值还是左值)。

如果你想知道一个表达式是右值还是左值,你需要知道的不仅仅是它的类型。在 decltype(std::string("")) 的情况下,您正在创建一个未命名的临时对象,它是一个右值。你不需要问它的类型就知道了。

  • string("Hello world!") may be a rvalue but does not seem to be a "reference of any kind" (either lvalue, rvalue, universal ... ) so that I got false result. Is there a way to get a true answer in case of a rvalue ?

你所说的“真实”答案是什么意思?你的意思是一个类型特征会给出结果 true 吗?

您可以询问该类型是否可转换为右值引用:

std::is_convertible<decltype(std::string("")), std::string&&>::value

这将告诉您是否可以将右值引用绑定(bind)到对象。但这是一个愚蠢的问题:当然,您可以将 X&& 类型的右值引用绑定(bind)到 X 类型的临时对象。您永远不需要问这个问题。

无论如何,你的函数不接受 string&& 类型的参数,所以问这个问题甚至不会告诉你关于你对 foo(std::string)< 的调用的任何信息

  • Is there copy elision or not in his example ?

是的,从临时字符串初始化函数参数不应该进行任何复制或移动,它们应该被省略。 C++14 标准在 [class.copy] p31 中说,当临时对象(尚未绑定(bind)到引用)将被复制/移动到相同类型的类对象时,可以省略复制/移动。从相同类型的临时变量初始化类类型的函数参数时满足该条件。不执行该省略的编译器(至少在启用优化时,或在“发布”版本中)是一个糟糕的编译器。

http://en.cppreference.com/w/cpp/language/copy_elision 上有复制省略规则的解释。 -- 见关于无名临时工的部分。

关于c++ - 构造字符串 ("Plain Old C chain") 是右值吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42066811/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com