Clang утверждает, что `базовый тип элемента 'X' не является структурой или объединением`, но X является структурным шаблоном с выведенными параметрами - PullRequest
0 голосов
/ 04 декабря 2018

Рассмотрим следующий код:

template <typename T> struct X
{
    X(T) {}
    void foo() {}
};

template <typename T> struct Y
{
    int object = 0;

    void bar()
    {
        X(object).foo();
    }
};

Live на gcc.godbold.org

GCC 8.2 компиляцииэто, в то время как Clang 7 выдает следующую ошибку:

<source>:13:18: error: member reference base type 'X' is not a structure or union
        X(object).foo();
        ~~~~~~~~~^~~~

Для меня это похоже на ошибку.

Условия очень специфичны: если какая-либо структура не являетсяшаблон, или если object не является переменной-членом, или если CTAD (вывод аргумента шаблона класса) не задействован, то Clang также компилирует код.

Что здесь происходит?Это действительно ошибка Clang?

И что более важно, как я могу заставить код компилироваться с минимальными изменениями, желательно без избавления от CTAD?


Единственный используемый флаг - это-std=c++17.

clang++ --version is

clang version 7.0.0 (tags/RELEASE_700/final 342594)
Target: x86_64-unknown-linux-gnu
Thread model: posix

1 Ответ

0 голосов
/ 04 декабря 2018

Да, это ошибка clang. Сбой вывода аргумента шаблона класса с выведенным типом при доступе к члену , который говорит:

Попробуйте скомпилировать следующую программу на С ++:

  template <class T>
  struct C {
    C(T) {}
    int a;
  };

  template <class T>
  int foo(T v) {
    return C{v}.a; // <----
  }

  int main() {
    foo(4);
  }

Строка, отмеченная выше, завершается с ошибкой:

error: member reference base type 'C' is not a structure or union
    return (C{v}).a;
           ~~~~~~^~

В отчете об ошибке также указываются работающие варианты, которые могут быть или не быть альтернативами.

Обратите внимание, что следующие все работают нормально:

  template <class T>
  C<T> foo(T v) {
    return C{v};
  }

и

int foo(int v) {
    return C{v}.a;
  }

и

  C{4}.a;

Я пробовал это также в недавней сборке транка(багажник 346600)

...