Здравствуйте, Bell, Вы писали:
B>Здравствуйте, Fasa, Вы писали:
F>>Почему, вот здесь хрень ничего не выводит. Как по мне так должно вывести " begins\n ends\n". В чем тут фокус?
B>В том, что все, что может быть воспринято как объявление, считается таковым. B>Лечится так:
B>
B>A a((std::string()));
B>
Еще лучше так (фокусы со скобакми — от лукавого и не читается):
A a = A(std::string());
Не стыдно попасть в дерьмо, стыдно в нём остаться!
Здравствуйте, demi, Вы писали:
D>Еще лучше так (фокусы со скобакми — от лукавого и не читается): D>
D>A a = A(std::string());
D>
Согласен, что так читается лучше, но тут есть одна тонкость: в отличие от исходного варианта с дополнительныеми скобками, который есть прямая инициализация, твой вариант использует инициализацию копированием. А это накладывает дополнительное требование на класс А — его конструктор копирования должен быть доступен.
Кстати вот еще один вариант:
A a(std::string(""));
Любите книгу — источник знаний (с) М.Горький
Re[4]: Объясните пожалуйста
От:
Аноним
Дата:
12.08.09 10:13
Оценка:
Здравствуйте, Bell, Вы писали:
B>Здравствуйте, demi, Вы писали:
D>>Еще лучше так (фокусы со скобакми — от лукавого и не читается): D>>
D>>A a = A(std::string());
D>>
B>Согласен, что так читается лучше, но тут есть одна тонкость: в отличие от исходного варианта с дополнительныеми скобками, который есть прямая инициализация, твой вариант использует инициализацию копированием. А это накладывает дополнительное требование на класс А — его конструктор копирования должен быть доступен.
B>Кстати вот еще один вариант: B>
B>A a(std::string(""));
B>
Здесь при инициализации A a конструктор копирования вызван не будет, так как это ИНИЗИАЛИЗАЦИЯ!
А>Здесь при инициализации A a конструктор копирования вызван не будет, так как это ИНИЗИАЛИЗАЦИЯ!
A a(std::string(""));
здесь — гарантированно не будет.
A a = A(std::string());
здесь — может быть да, а может быть нет (скорее всего — не будет) — компилятор вправе обойтись без создания временного объекта, но конструктор копирования должен быть доступен. Обсуждалось уже тыщщу раз.
Любите книгу — источник знаний (с) М.Горький
Re[6]: Объясните пожалуйста
От:
Аноним
Дата:
12.08.09 10:32
Оценка:
Здравствуйте, Bell, Вы писали:
B>Здравствуйте, Аноним, Вы писали:
А>>Здесь при инициализации A a конструктор копирования вызван не будет, так как это ИНИЗИАЛИЗАЦИЯ!
B>
B>A a(std::string(""));
B>
B>здесь — гарантированно не будет.
B>
B>A a = A(std::string());
B>
B>здесь — может быть да, а может быть нет (скорее всего — не будет) — компилятор вправе обойтись без создания временного объекта, но конструктор копирования должен быть доступен. Обсуждалось уже тыщщу раз.
A a = A(std::string()); здесь тоже не будет (контр пример в студию, с указанием компилятора)!
Кстати, в шестерке A a(std::string()); выведет begins\nends\n (это говорит о ее корявости не более, того)
Здравствуйте, Аноним, Вы писали:
А>A a = A(std::string()); здесь тоже не будет (контр пример в студию, с указанием компилятора)! А>Кстати, в шестерке A a(std::string()); выведет begins\nends\n (это говорит о ее корявости не более, того)
[Тяжело вздыхая...]
#include <iostream>
#include <string>
class A
{
public:
A(const std::string& s) : s(s)
{
std::cout << s << " begins\n";
}
~A() { std::cout << s << " ends\n"; }
private:
A(const A&);
std::string s;
};
int main()
{
A a = A(std::string());
return 0;
}
А вообще пример не очень удачный — здесь в явном виде требуется вызов конструктора копирования (речь не о том — будет ли он вызван в реальности), поэтому любой вменяемый компилятор этот пример не скомпилирует.
В этом плане интереснее вот такая запись:
A a = std::string();
Любите книгу — источник знаний (с) М.Горький
Re[8]: Объясните пожалуйста
От:
Аноним
Дата:
12.08.09 11:12
Оценка:
Здравствуйте, Bell, Вы писали:
B>Здравствуйте, Аноним, Вы писали:
А>>A a = A(std::string()); здесь тоже не будет (контр пример в студию, с указанием компилятора)! А>>Кстати, в шестерке A a(std::string()); выведет begins\nends\n (это говорит о ее корявости не более, того)
B>[Тяжело вздыхая...]
B>
B>Comeau: http://www.nixie.narod.ru/comeau/index.htm B>Codepad: http://codepad.org
B>А вообще пример не очень удачный — здесь в явном виде требуется вызов конструктора копирования (речь не о том — будет ли он вызван в реальности), поэтому любой вменяемый компилятор этот пример не скомпилирует. B>В этом плане интереснее вот такая запись: B>
B>Согласен, что так читается лучше, но тут есть одна тонкость: в отличие от исходного варианта с дополнительныеми скобками, который есть прямая инициализация, твой вариант использует инициализацию копированием. А это накладывает дополнительное требование на класс А — его конструктор копирования должен быть доступен.
Строго говоря, в контексте copy-initialization здесь рассматриваются все преобразующие конструкторы, в том числе A(const std::string&), поэтому данный код теоретически можно заставить работать без доступного копирующего конструктора у A: