Шаблонный аргумент, прерванный в Clang 6 для временных объектов - PullRequest
0 голосов
/ 21 мая 2018

Вывод аргумента шаблона, похоже, не работает в Clang 6 для временных объектов.

g ++ 8.1.0 компилирует и запускает пример правильно.

Clang 6.0.0 и 6.0.2 обе ошибкив указанной строке с этим сообщением:

error: expected unqualified-id
    Print{1,"foo"s,2};  /********** Broken in Clang **********/

Все остальные строки работают правильно.

Поведение одинаково в обоих случаях, используется ли -std=c++17 или -std=c++2a.

Страница состояния Clang c ++ указывает, что вычитание аргумента шаблона было реализовано с Clang 5 (P0091R3, P0512R0).

Это ошибка?Существуют ли обходные пути (например, флаги компилятора, , а не изменения кода )?

пример:

template<class ...Ts>
void print(Ts...ts){ (( cout << ... << ts )); }
template<class ...Ts>
struct Print {
    Print(Ts...ts){ (( cout << ... << ts )); }
};

int main(){
    Print{1,"foo"s,2}; /********** Broken in Clang **********/
    Print<int,string,int>{1,"foo"s,2};
    auto p1 = Print{1,"foo"s,2};
    Print p2{1,"foo"s,2};
    print(1,"foo"s,2);
}

1 Ответ

0 голосов
/ 21 мая 2018

Это ошибка Clang 34091 .

К счастью, она уже исправлена, и сборка ствола Clang компилирует это без проблем .

Насколько я знаю, однако, в настоящее время нет способа обойти это без изменений кода, если не считать обновления до следующего выпуска Clang, когда это выйдет.

...