LINUX.ORG.RU

[C++,boost::proto] Что такое есть {{}} ?


0

1

В примере из руководства для boost::proto что может обозначать/выполнять код

proto::terminal<placeholder<0> >::type const _1 = {{}};
, а именно удвоенные скобки {{}} ? В стандарте что-то похожее нашёл лишь в списках инициализации, но там во вложенных скобках значения, которыми инициализация и проводится.

Например

#include <iostream>

struct inner {
    int a;
    int b;
    int c;
};

struct outer {
    inner i;
    int a;
    int b;
    int c;
};
    
int main () {
    outer wow = {{}};
    std::cout << wow.i.a << wow.i.b << wow.i.c
              << wow.a << wow.b << wow.c
              << std::endl;
    return 0;
}
yoghurt ★★★★★
()

>там во вложенных скобках значения, которыми инициализация и проводится.

В Proto, видимо, так же. Как я понял из беглого осмотра, там так формируется контекст, в рамках которого потом будет вычисляться выражение (а может быть и не так :))

Просто скобки могут быть и пустыми, тогда всё по нулям

yoghurt ★★★★★
()
Ответ на: комментарий от yoghurt

Ага, вроде бы понятно, буду дальше разбираться. Вопрос, пожалуй, закрыт.

one_more_hokum ★★★
() автор топика
Ответ на: комментарий от yoghurt

не по нулям

8.5.1/8

An empty initializer-list can be used to initialize any aggregate. If the aggregate is not an empty class, then each member of the aggregate shall be initialized with a value of the form T() (5.2.3), where T represents the type of the uninitialized member.

anonymous
()
Ответ на: комментарий от anonymous

А вот что написано в моей копии стандарта (правда, емнип, это один из драфтов грядущего):

8.5.1/7

If there are fewer initializer-clauses in the list than there are members in the aggregate, then each member not explicitly initialized shall be value-initialized (8.5).
[ Example:
struct S { int a; char* b; int c; };
S ss = { 1, «asdf» };
initializes ss.a with 1, ss.b with «asdf», and ss.c with the value of an expression of the form int(), that is, 0.
—end example ]

8.5/7

To value-initialize an object of type T means:
— if T is a (possibly cv-qualified) class type (Clause 9) with a user-provided constructor (12.1), then the default constructor for T is called (and the initialization is ill-formed if T has no accessible default constructor);
— if T is a (possibly cv-qualified) non-union class type without a user-provided constructor, then the object is zero-initialized and, if T’s implicitly-declared default constructor is non-trivial, that constructor is called.
— if T is an array type, then each element is value-initialized;
— otherwise, the object is zero-initialized.

yoghurt ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.