Объясните инвалиду детства на голову, почему компилируя следующий код с помощью VS2005 я получаю предупреждение C4239?
По какой причине такое преобразование запрещено стандартом? Где тут грабли?
И как добиться желаемого результат без предупреждений?
Здравствуйте, Аноним, Вы писали:
А>Объясните инвалиду детства на голову, почему компилируя следующий код с помощью VS2005 я получаю предупреждение C4239? А>По какой причине такое преобразование запрещено стандартом? Где тут грабли? А>И как добиться желаемого результат без предупреждений?
Связано с тем, что auto_ptr1 копируется при выходе из функции. Но его конструктор копирования принимает неконстантную ссылку. А временный объект не может быть передан по неконстантой ссылке.
Здравствуйте, Аноним, Вы писали:
А>Объясните инвалиду детства на голову, почему компилируя следующий код с помощью VS2005 я получаю предупреждение C4239? А>По какой причине такое преобразование запрещено стандартом? Где тут грабли? А>И как добиться желаемого результат без предупреждений?
А другие компиляторы, Comeau, например, вообще ошибку выдают. А дело в том, что конструкция:
return auto_ptr1(new int);
использует коструктор копии для копирования временного объекта auto_ptr1(new int) в результат функции. Но конструктор копии твоего класса принимает неконстантную ссылку. А, как известно, на временные объекты по стандарту можно получать только константные ссылки.
Здравствуйте, Were, Вы писали:
W>Здравствуйте, Аноним, Вы писали:
А>>Объясните инвалиду детства на голову, почему компилируя следующий код с помощью VS2005 я получаю предупреждение C4239? А>>По какой причине такое преобразование запрещено стандартом? Где тут грабли? А>>И как добиться желаемого результат без предупреждений?
W>Можно решить так W>
W>auto_ptr1 Func()
W>{
W> return new int;
W>}
W>
Вообще-то, в классах умных указателей, во избежание сюрпризов, конструкторы по указателям обычно объявляют explicit. Поэтому так лучше не делать.
--
Справедливость выше закона. А человечность выше справедливости.
Здравствуйте, rg45, Вы писали:
R>Второй способ — сделать так, чтоб коструктор копии принимал константную ссылку, а член _Myptr объявить с ключевым словом mutable:
Так нельзя делать, это обман. Человек, копирующий объект посредством конструктора с параметром-константой, ожидает, что оригинал останется неизменённым.
Здравствуйте, Centaur, Вы писали:
C>Так нельзя делать, это обман. Человек, копирующий объект посредством конструктора с параметром-константой, ожидает, что оригинал останется неизменённым.
Лично я с этим согласен. Но именно так себя ведет std::auto_ptr.
--
Справедливость выше закона. А человечность выше справедливости.
C>>Так нельзя делать, это обман. Человек, копирующий объект посредством конструктора с параметром-константой, ожидает, что оригинал останется неизменённым.
R>Лично я с этим согласен. Но именно так себя ведет std::auto_ptr.
только у std::auto_ptr конструктор принимает обычую ссылку, а не константную.
Явно говоря, что с параметром может произойти что-то нехорошее.
Здравствуйте, Vladimir35, Вы писали:
R>>Второй способ — сделать так, чтоб коструктор копии принимал константную ссылку, а член _Myptr объявить с ключевым словом mutable: V>Думаете, поможет?
Здравствуйте, K13, Вы писали:
C>>>Так нельзя делать, это обман. Человек, копирующий объект посредством конструктора с параметром-константой, ожидает, что оригинал останется неизменённым.
R>>Лично я с этим согласен. Но именно так себя ведет std::auto_ptr.
K13>только у std::auto_ptr конструктор принимает обычую ссылку, а не константную. K13>Явно говоря, что с параметром может произойти что-то нехорошее.
Да, действительно. Наврал я, получается. Честно говоря, std::auto_ptr я недолюбливаю и практически не использую.
--
Справедливость выше закона. А человечность выше справедливости.
Здравствуйте, Аноним, Вы писали:
А>Объясните инвалиду детства на голову, почему компилируя следующий код с помощью VS2005 я получаю предупреждение C4239? А>По какой причине такое преобразование запрещено стандартом? Где тут грабли? А>И как добиться желаемого результат без предупреждений?
crable:
C>Подсмотреть как это сделано в std::auto_ptr
Кстати, копирующий конструктор можно вообще сделать закрытым. Тот, кто захочет забрать владение у объекта, обозначаемого lvalue, может продемонстрировать своё намерение явно посредством вызова функции move: