В настоящее время я изучаю некоторые шаблоны. Но у меня возник вопрос. у меня такой класс
class myobj{
public:
int val;
char single;
string name;
myobj(){}
myobj(int a):val(a){};
myobj(int a, char b, string& c): val(a), single(b), name(move(c)){};
};
А вот и функция main
int main(){
cout << is_constructible<myobj, int>::value << endl; //true
cout << is_constructible<myobj, int, char, string>::value << endl; //false
cout << is_constructible<myobj, int, char, string&>::value << endl; //true
return 0;
}
Не могу понять, почему второй будет ложным. Означает ли это, что я не могу использовать string
для создания объекта?
Когда сигнатура функции показывает, что параметр передается по ссылке, я думаю, что можно передать ему значение. Нет ли недопонимания по поводу ссылки?
@KarlKnechtel в этих случаях я обычно делал бы по значению, тогда пользователь интерфейса может выбрать, и он работает для типов rvalue и lvalue.
Можешь попробовать:
myobj(1, 'c', std::string{"lalala"});
Это строка, да, так что она должна компилироваться? Нет:
error: cannot bind non-const lvalue reference of type 'std::string&' {aka 'std::__cxx11::basic_string<char>&'} to an rvalue of type 'std::string' {aka 'std::__cxx11::basic_string<char>'}
20 | myobj(1, 'c', std::string{"lalala"});
string
в этом контексте может ссылаться на rvalue, но на rvalue не может ссылаться обычная ссылка lvalue. string&
должен быть изменчивым, поэтому между string
и string&
есть разница (очень сильная).
Вы пытались использовать ссылку
const
?