Вывод аргумента шаблона по умолчанию для инициализации копирования - PullRequest
0 голосов
/ 11 октября 2018

C ++ 17 имеет вычет аргумента шаблона класса .Однако мне было интересно, относится ли это к таким утверждениям, как auto x = X(), где X - это шаблон класса.Рассмотрим этот код:

template <typename T = void>
struct X {};

int main() {       // all with -std=c++17
    X<> x0;        // compiles in both clang and gcc
    X x1;          // compiles in both clang and gcc
    auto x2 = X(); // compiles in clang but not gcc
    X<> x3 = X();  // compiles in clang but not gcc
}

Вот ссылка godbolt .Итак, какой компилятор прав, и является ли эта программа допустимой C ++ 17?

1 Ответ

0 голосов
/ 11 октября 2018

Это ошибка в GCC.

Обратите внимание, что если заменить круглые скобки фигурными скобками, код скомпилируется:

auto x2 = X{}; // now compiles in clang and gcc
X<> x3 = X{}; // now compiles in clang and gcc

Это не вывод аргумента шаблона класса, посколькуне выводятся аргументы шаблона. Вывод аргумента шаблона класса должен разрешать исключение фигурных скобок.Использование () или {} в этом случае не должно иметь никакого отношения к тому, выводятся ли они.

...