Я думал, что универсальная ссылка (T&&
) должна принимать любые ссылки. Но следующее не работает.
Я сталкиваюсь с этой проблемой, когда пытаюсь быть константно-правильным в библиотеке, которую я пишу. Я новичок в C ++ и раньше не видел ничего подобного.
test.cpp:
enum Cv_qualifier {
constant,
non_const
};
template <Cv_qualifier Cv> class A;
template<>
class A<Cv_qualifier::constant> {
public:
template<Cv_qualifier Cv2>
void t(const A<Cv2>&& out) {}
};
template <>
class A<Cv_qualifier::non_const> {
public:
template<Cv_qualifier Cv2>
void t(const A<Cv2>&& out) {}
};
int main()
{
A<Cv_qualifier::non_const> a;
A<Cv_qualifier::constant> b;
a.t(b);
}
Ошибка (скомпилировано с g++ test.cpp -std=c++11
):
test.cpp: In function ‘int main()’:
test.cpp:24:10: error: cannot bind ‘A<(Cv_qualifier)0u>’ lvalue to ‘const A<(Cv_qualifier)0u>&&’
a.t(b);
^
test.cpp:17:10: note: initializing argument 1 of ‘void A<(Cv_qualifier)1u>::t(const A<Cv2>&&) [with Cv_qualifier Cv2 = (Cv_qualifier)0u]’
void t(const A<Cv2>&& out) {}
^
Между прочим, в реальной программе class A
не владеет никакими фактическими данными и содержит ссылки на другой класс, который фактически хранит данные. Надеюсь, это означает, что я не создаю постоянно косвенные / копируемые данные, когда разрешаю функции-члену t
из class A
принимать временные объекты.
std::vector<T>&&
илиclass_name<Template parameters>&&
не являются универсальными ссылками? А единственный способ написать универсальную ссылку - этоT&&
? Я думал, что нужно вывести параметр шаблонаCv_2
функции-членаt
. - person hamster on wheels   schedule 15.11.2016T&&
- это единственный способ создать аргумент, который принимает ссылки как на l-значение, так и на r-значение. - person hamster on wheels   schedule 16.11.2016T&&
- не единственный способ для функции принимать l-значения и r-значения. В вашем случае все, что вам нужно сделать, это принятьA<Cv2> const&
, и он примет все, что угодно. - person Edward Strange   schedule 16.11.2016T&&
, аT
является параметром шаблона функции - person M.M   schedule 16.11.2016A<Cv2> const& a
предотвратить изменение значений a? Хорошо, я понимаю. Таким образом, он ограничивает изменение значений a. это постоянная ссылка. stackoverflow.com/ questions / 3694630 / - person hamster on wheels   schedule 16.11.2016