Рассмотрим следующий код:
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