Инициализированный нулем, безымянный, временный без знака int - PullRequest
4 голосов
/ 24 марта 2020

Прав ли я интерпретировать unsigned int{}; как инициализация нуля временного unsigned int без имени в контекстах, представленных ниже? Пример не работает с clang или g cc, но прекрасно компилируется в Visual Studio: https://godbolt.org/z/LYWCCN

int ifun(int value) {
    return value * 10;
}

unsigned int uifun(unsigned int value) {
    return value * 10u;
}

int main() {
    // does not work in gcc and clang
    unsigned int{};
    unsigned int ui = uifun(unsigned int{});

    // works with all three compilers, also unsigned{}; works
    int{};
    int i = ifun(int{});
}

Ответы [ 2 ]

3 голосов
/ 24 марта 2020

Clang и G cc правы. unsigned int{}; рассматривается как явное преобразование типов во-первых, которое работает только с именем типа из одного слова; в то время как unsigned intint* et c) нет, но int есть.

(выделено мной)

5) A одно слово имя типа , за которым следует braced-init-list - это значение указанного типа designating a temporary (until C++17) whose result object is (since C++17) direct-list-initialized с указанным скобками -init-list .

В качестве обходного пути вы можете

using unsigned_int = unsigned int;
unsigned_int{};

В результате он будет инициализировать значение (инициализировать нулем) временный unsigned int как вы и ожидали.

2 голосов
/ 24 марта 2020

Вы можете использовать псевдоним типа, чтобы обойти ограничение.

using UI = unsigned int;
UI{};
UI ui = uifun(UI{});
...