Я хочу обеспечить явное преобразование между структурами, похожими на нативные типы:
int i1;
i1 = some_float; // this generates a warning
i1 = int(some_float): // this is OK
int i3 = some_float; // this generates a warning
Я думал использовать оператор присваивания и конструктор копирования, чтобы сделать одно и то же, но поведение отличается:
Struct s1;
s1 = other_struct; // this calls the assignment operator which generates my warning
s1 = Struct(other_struct) // this calls the copy constructor to generate a new Struct and then passes that new instance to s1's assignment operator
Struct s3 = other_struct; // this calls the COPY CONSTRUCTOR and succeeds with no warning
Есть ли какие-нибудь хитрости, чтобы получить этот третий случай Struct s3 = other_struct;
Сконструировать s3 с конструктором по умолчанию, а затем вызвать оператор присваивания?
Все это компилируется и выполняется так, как должно.Поведение C ++ по умолчанию заключается в вызове конструктора копирования вместо оператора присваивания, когда вы создаете новый экземпляр , а вызывает конструктор копирования сразу (т.е. MyStruct s = other_struct;
становится MyStruct s(other_struct)
; не MyStruct s; s = other_struct;
Мне просто интересно, есть ли какие-нибудь хитрости, чтобы обойти это.
РЕДАКТИРОВАТЬ: "Явное" ключевое слово как раз то, что мне нужно!
class foo {
foo(const foo& f) { ... }
explicit foo(const bar& b) { ... }
foo& operator =(const foo& f) { ... }
};
foo f;
bar b;
foo f2 = f; // this works
foo f3 = b; // this doesn't, thanks to the explicit keyword!
foo f4 = foo(b); // this works - you're forced to do an "explicit conversion"