Потому что C ++ обрабатывает типы классов и встроенные типы по-разному.
Для встроенных типов нельзя определить значения.
Для типов классов, например, std::string
, test2(h) = "hello";
точно так же, как test2(h).operator=("hello");
;operator=
является членом std::string
, это не является особенным с другими функциями-членами.Это верно, если члену operator=
разрешено вызываться по r-значению, и это верно для std::string::operator=
.Вы даже можете написать что-то вроде std::string{} = "hello";
, то есть назначить временное, которое скоро будет уничтожено, что не имеет особого смысла.
Если вы хотите ограничить функцию-член пользовательского класса, можетевызываться только для lvalue, вы можете указать lvalue ref-qualifier (начиная с C ++ 11) или наоборот.например,
struct X {
X& operator=(const char*) & { return *this; }
// ^
};
LIVE