TestStruct(const TestStruct &) = delete;
TestStruct(TestStruct &&) {};
};
void test(TestStruct &&s) {
TestStruct new_struct(s);
}
void test1(TestStruct &&s) {
TestStruct new_struct(static_cast<decltype(s)>(s));
}
почему в этом коде функция test не компилируется, с ошибкой якобы я пытаюсь вызывать удалённый коструктор TestStruct(const TestStruct &), но при этом функция test1 где я касщу казалось бы к тому же самому типу, который и так у аргумента s - прекрасно компилируется.
rvalue reference каким-то образом неявно превращается в lvalue reference?
вот ошибка компилятора:
<path>/Main.cpp: In function ‘void test(TestStruct&&)’:
<path>/Main.cpp:12:28: error: use of deleted function ‘TestStruct::TestStruct(const TestStruct&)’
12 | TestStruct new_struct(s);
| ^
<path>/Main.cpp:7:5: note: declared here
7 | TestStruct(const TestStruct &) = delete;
| ^~~~~~~~~~
Потому что типы у аргумента s и у выражения s разные.
можно подробнее, либо линк где про это можно почитать.
Принятое по рвалуе-ссылке - это все равно лвалуе. Не хватает мужа
TestStruct new_struct(std::move(s));
до этого я и без вас могу догадаться) вопрос ведь не в этом.
Да, он rvalue кастится в lvalue int& f(void) noexcept { static int i = 123; return i; } template<typename Type1, typename Type2> concept s = std::is_same_v<Type1, Type2>; int main(void) { auto i1 = f(); decltype(auto) i2 = f(); std::cout << s<decltype(i1), int> << std::endl; std::cout << s<decltype(i2), int&> << std::endl; }
Обсуждают сегодня