Мне было интересно, будет ли копирование в вызове 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? - Есть ли в его примере копия или нет?