Мне было интересно, будет ли копирование в вызове foo(string)
ниже.
(Примечание: foo(string)
принадлежит интерфейсу, который я не могу изменить).
Для этого я попытался проверить, построил ли string("Hello world!")
rvalue
.
Я искал на SO, как это сделать программно, и нашел это сообщение: Как определить программно, если выражение rvalue или lvalue в С++?
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
Я думал, что получаю true
до is_rvalue_reference< xxx >::value
- Где я ошибаюсь?
-
string("Hello world!")
может бытьrvalue
, но, похоже, не является "ссылкой любого вида" (либоlvalue
,rvalue
, universal...), так что я получил результатfalse
. Есть ли способ получить ответtrue
в случаеrvalue
? - Есть ли в его примере копия или нет?