Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 24.05.2014, 08:32   #1
220Volt
Форумчанин
 
Регистрация: 14.12.2012
Сообщений: 671
По умолчанию {} initialization

Здравствуйте.
С++11 ввел (расширил возможности) данный тип инициализации. Но вот что за грабли, почему не вызывается копирующий конструктор до тех пор, пока явно его не прописать?
Код:
struct S {
    // S(){}            // #1
    // S(const S&){}    // #2
};

int main()
{
    S d;
    S t {d};        // error
    S tt(d);        // ok

    return 0;
}
Clang и gcc ругаются. Полистал Страуструпа, он вызывал дефолтовый копирующий конструктор через {}.
220Volt вне форума Ответить с цитированием
Старый 24.05.2014, 10:50   #2
Somebody
Участник клуба
 
Регистрация: 08.10.2007
Сообщений: 1,185
По умолчанию

http://www.open-std.org/jtc1/sc22/wg...2012/n3337.pdf
Цитата:
8.5.1 Aggregates [dcl.init.aggr]
1 An aggregate is an array or a class (Clause 9) with no user-provided constructors (12.1), no brace-or-equalinitializers for non-static data members (9.2), no private or protected non-static data members (Clause 11), no base classes (Clause 10), and no virtual functions (10.3).
8.5.4.3:
Цитата:
List-initialization of an object or reference of type T is defined as follows:
— If the initializer list has no elements and T is a class type with a default constructor, the object is value-initialized.
— Otherwise, if T is an aggregate, aggregate initialization is performed (8.5.1).
[ Example:
...
—end example ]
— Otherwise ...
В данном случае это попадает под aggregate initialization, что можно использовать в виде:
Код:
struct S {
    int a, b, c;
};
S d {1, 2, 3};
Somebody вне форума Ответить с цитированием
Старый 24.05.2014, 14:39   #3
220Volt
Форумчанин
 
Регистрация: 14.12.2012
Сообщений: 671
По умолчанию

Была такая мысль. Но посмотрел на Страуструпа и оставил ее, он приводит такой код, который тоже не компилируется:
Код:
#include <string>
using namespace std;

struct Work {
    string author;
    string name;
    int year;
};

int main()
{
    Work s9 { "Beethoven",
              "Symphony No. 9 in D minor, Op. 125; Choral",
              1824
            };                      // memberwise initialization
    Work currently_playing { s9 };  // copy initialization    // error
    Work none {};                   // default initialization

    return 0;
}
Еще так пробовал, тоже не заработало:
Код:
struct S {
     S() = default;
};

int main()
{
    S d;
    S t {d};        // error
    S tt(d);        // ok

    return 0;
}
Спасибо за ответ, вывод из категории "Aggregate" решает вопрос.

Последний раз редактировалось 220Volt; 24.05.2014 в 14:44.
220Volt вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ошибка error C2374: 'n' : redefinition; multiple initialization inmanika Помощь студентам 5 13.12.2011 01:22