Объясните пожалуйста
От: Fasa Беларусь  
Дата: 10.08.09 09:54
Оценка:
Почему, вот здесь хрень ничего не выводит. Как по мне так должно вывести " begins\n ends\n". В чем тут фокус?
Re: Объясните пожалуйста
От: посетитель rsdn.life  
Дата: 10.08.09 09:58
Оценка: +1
Здравствуйте, Fasa, Вы писали:

F>Почему, вот здесь хрень ничего не выводит. Как по мне так должно вывести " begins\n ends\n". В чем тут фокус?

A a(std::string());

Компилятор принимает эту строчку за объявление функции.
Re: Объясните пожалуйста
От: Bell Россия  
Дата: 10.08.09 10:17
Оценка: 4 (1)
Здравствуйте, Fasa, Вы писали:

F>Почему, вот здесь хрень ничего не выводит. Как по мне так должно вывести " begins\n ends\n". В чем тут фокус?


В том, что все, что может быть воспринято как объявление, считается таковым.
Лечится так:

A a((std::string()));
Любите книгу — источник знаний (с) М.Горький
Re[2]: Объясните пожалуйста
От: demi США  
Дата: 12.08.09 08:16
Оценка:
Здравствуйте, Bell, Вы писали:

B>Здравствуйте, Fasa, Вы писали:


F>>Почему, вот здесь хрень ничего не выводит. Как по мне так должно вывести " begins\n ends\n". В чем тут фокус?


B>В том, что все, что может быть воспринято как объявление, считается таковым.

B>Лечится так:

B>
B>A a((std::string()));
B>


Еще лучше так (фокусы со скобакми — от лукавого и не читается):
A a = A(std::string());
Не стыдно попасть в дерьмо, стыдно в нём остаться!
Re[3]: Объясните пожалуйста
От: Bell Россия  
Дата: 12.08.09 08:54
Оценка:
Здравствуйте, 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 конструктор копирования вызван не будет, так как это ИНИЗИАЛИЗАЦИЯ!
Re[5]: Объясните пожалуйста
От: Bell Россия  
Дата: 12.08.09 10:28
Оценка:
Здравствуйте, Аноним, Вы писали:


А>Здесь при инициализации 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 (это говорит о ее корявости не более, того)
Re[7]: Объясните пожалуйста
От: Bell Россия  
Дата: 12.08.09 10:43
Оценка:
Здравствуйте, Аноним, Вы писали:

А>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;
}


Comeau: http://www.nixie.narod.ru/comeau/index.htm
Codepad: http://codepad.org

А вообще пример не очень удачный — здесь в явном виде требуется вызов конструктора копирования (речь не о том — будет ли он вызван в реальности), поэтому любой вменяемый компилятор этот пример не скомпилирует.
В этом плане интереснее вот такая запись:
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>#include <iostream>
B>#include <string>

B>class A
B>{
B>public:
B>  A(const std::string& s) : s(s) 
B>  { 
B>    std::cout << s << " begins\n"; 
B>  }  
B>  ~A() { std::cout << s << " ends\n"; }

B>private:
B>  A(const A&);
B>  std::string s;
B>};

B>int main()
B>{
B>  A a = A(std::string()); 
B>  return 0;
B>}
B>


B>Comeau: http://www.nixie.narod.ru/comeau/index.htm

B>Codepad: http://codepad.org

B>А вообще пример не очень удачный — здесь в явном виде требуется вызов конструктора копирования (речь не о том — будет ли он вызван в реальности), поэтому любой вменяемый компилятор этот пример не скомпилирует.

B>В этом плане интереснее вот такая запись:
B>
B>A a = std::string();
B>


Виноват, был неправ, спасибо!
Re[4]: Объясните пожалуйста
От: Николай Ивченков  
Дата: 12.08.09 17:05
Оценка:
Bell:

D>>
A a = A(std::string());


B>Согласен, что так читается лучше, но тут есть одна тонкость: в отличие от исходного варианта с дополнительныеми скобками, который есть прямая инициализация, твой вариант использует инициализацию копированием. А это накладывает дополнительное требование на класс А — его конструктор копирования должен быть доступен.


Строго говоря, в контексте copy-initialization здесь рассматриваются все преобразующие конструкторы, в том числе A(const std::string&), поэтому данный код теоретически можно заставить работать без доступного копирующего конструктора у A:

#include <iostream>
#include <string>

class A
{
public:
    A(const std::string& s) : s(s) 
    { 
        std::cout << "ctor" << std::endl; 
    }
    operator const std::string&() const
    {
        std::cout << "conversion function" << std::endl;
        return s;
    }
    ~A()
    {
        std::cout << "dtor" << std::endl;
    }

private:
    explicit A(const A&);
    std::string s;
};

int main()
{
    A a = A(std::string()); 
}
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.