Вывод аргумента шаблона класса из шаблона класса члена - PullRequest
0 голосов
/ 28 февраля 2019

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

template <typename T1>
struct OuterFoo {
  template <typename T2>
  struct InnerFoo  {
    InnerFoo(T2 v2) {}
  };

  explicit OuterFoo(T1 v1) {}
};

int main() {
  OuterFoo outer_foo{6};
  OuterFoo<int>::InnerFoo inner_foo{3};

  return 0;
}

https://godbolt.org/z/RjUuWM

clang отказывается компилировать это, заявляя, что «нет жизнеспособного конструктора или руководства по выводам для вывода аргументов шаблона« InnerFoo »» - Gccс другой стороны, компилируется без проблем.

Является ли приведенный пример правильным (как в стандарте) использованием CTAD и здесь ли clang виноват?

Если предоставляется руководство по выводу, clang компилируетхорошо, но gcc не принимает руководство: https://godbolt.org/z/4b-9Cr

template <typename T1>
struct OuterFoo {
  template <typename T2>
  struct InnerFoo  {
    InnerFoo(T2 v2) {}
  };

  // This Template Deduction Guide is required in clang 6
  // for the example to compile.
  // GCC compiles without this TDG but reports an error
  // with it
  // "deduction guide ‘OuterFoo<T1>::InnerFoo(T2) -> OuterFoo<T1>::InnerFoo<T2>’
  // must be declared at namespace scope"
  template<typename T2> InnerFoo(T2 v2) -> InnerFoo<T2>;

  // ...but no TDG is required for OuterFoo
  explicit OuterFoo(T1 v1) {}
};

int main() {
  OuterFoo outer_foo{6};
  OuterFoo<int>::InnerFoo inner_foo{3};

  return 0;
}

Каково состояние CTAD для классов шаблонов элементов в clang и gcc?Это просто еще не там?

1 Ответ

0 голосов
/ 28 февраля 2019

Каково состояние CTAD для классов шаблонов элементов в clang и gcc?Просто его еще нет?

Согласно странице поддержки языковых возможностей для GCC , CTAD доступен для версий 7 и выше.

enter image description here

Согласно странице поддержки языковых возможностей для Clang , CTAD доступен для версий 7 и выше.

![enter image description here

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...