Листал недавно stackoverflow, а там такое:
От: B0FEE664  
Дата: 24.09.20 10:23
Оценка: 6 (2)
Отсюда:
template<class... Parameter> struct Outer
{
    template<Parameter... Value> struct Inner
    {
        static bool Member;
    };
};

template<class... Parameter>
template<Parameter... Value>
bool Outer<Parameter...>::Inner<Value...>::Member = true;

int main()
{
    Outer<int>::Inner<0>::Member = false;
    return 0;
}


Это корректный код или нет? И почему некоторые компиляторы его не компилируют?
И каждый день — без права на ошибку...
Re: Листал недавно stackoverflow, а там такое:
От: reversecode google
Дата: 24.09.20 15:27
Оценка: -1
BFE>Это корректный код или нет? И почему некоторые компиляторы его не компилируют?

корректный
потому что у тех некоторых компиляторах сотни таких же багов которые с 13 годов не фиксятся, даже если конфирмед
и даже студия уже в инсталляторе предлагает правильный кланг
потому что не каждый корректный код msvc может скомпилить
ну а гцц так и подавну
Re[2]: Листал недавно stackoverflow, а там такое:
От: B0FEE664  
Дата: 24.09.20 15:40
Оценка:
Здравствуйте, reversecode, Вы писали:

BFE>>Это корректный код или нет? И почему некоторые компиляторы его не компилируют?


R>корректный

Это точно? Я вот в чём не уверен:
template<class... Parameter> // тут мы получили имя Parameter
template<Parameter... Value> // а тут разве Parameter... связан как-то с Parameter ? Вроде бы это независимые имена. Или нет? 
bool Outer<Parameter...>::Inner<Value...>::Member = true;
И каждый день — без права на ошибку...
Re[3]: Листал недавно stackoverflow, а там такое:
От: reversecode google
Дата: 24.09.20 15:51
Оценка:
поднимаем глазки выше где два шаблона на структурах
и задаем и отвечаем на ваш вопрос мысленно
Re[3]: Листал недавно stackoverflow, а там такое:
От: night beast СССР  
Дата: 24.09.20 15:52
Оценка:
Здравствуйте, B0FEE664, Вы писали:

R>>корректный

BFE>Это точно? Я вот в чём не уверен:
BFE>
BFE>template<class... Parameter> // тут мы получили имя Parameter
BFE>template<Parameter... Value> // а тут разве Parameter... связан как-то с Parameter ? Вроде бы это независимые имена. Или нет? 
BFE>bool Outer<Parameter...>::Inner<Value...>::Member = true;
BFE>


представь что Parameter не parameter pack а конкретный тип:
template<typename T> 
template<T Value> // тут T как-нибудь связан с внешним?
bool Outer<T>::Inner<Value>::Member = true;
Re[4]: Листал недавно stackoverflow, а там такое:
От: B0FEE664  
Дата: 24.09.20 16:09
Оценка:
Здравствуйте, reversecode, Вы писали:

R>поднимаем глазки выше где два шаблона на структурах

R>и задаем и отвечаем на ваш вопрос мысленно

А зачем глазки поднимать?
Тут главное ответить правильно, как, например, в коде ниже:
#include <iostream>

template<class TA>
class A
{
  public:
    template<class TF>
    TF fun(TA x);
};

template<class TX>
template<class TY>
TY A<TX>::fun(TX x)
{
  return TY{};
}


int main() {

  A<int> aa;
  std::cout << aa.fun<float>(1) << std::endl;
  
  return 0;
}


Где тут зависимости между TA, TF, TX и TY?
И каждый день — без права на ошибку...
Отредактировано 24.09.2020 16:12 B0FEE664 . Предыдущая версия .
Re[4]: Листал недавно stackoverflow, а там такое:
От: B0FEE664  
Дата: 24.09.20 16:11
Оценка:
Здравствуйте, night beast, Вы писали:

R>>>корректный

BFE>>Это точно? Я вот в чём не уверен:
BFE>>
BFE>>template<class... Parameter> // тут мы получили имя Parameter
BFE>>template<Parameter... Value> // а тут разве Parameter... связан как-то с Parameter ? Вроде бы это независимые имена. Или нет? 
BFE>>bool Outer<Parameter...>::Inner<Value...>::Member = true;
BFE>>


NB>представь что Parameter не parameter pack а конкретный тип:

NB>
NB>template<typename T> 
NB>template<T Value> // тут T как-нибудь связан с внешним?
NB>bool Outer<T>::Inner<Value>::Member = true;
NB>


Я могу и такое вот представить:
template<typename T> 
template<int Value> // тут int и T как-нибудь связаны?
bool Outer<T>::Inner<Value>::Member = true;
И каждый день — без права на ошибку...
Re[3]: Листал недавно stackoverflow, а там такое:
От: vopl Россия  
Дата: 24.09.20 16:19
Оценка: 1 (1)
Здравствуйте, B0FEE664, Вы писали:

BFE>>>Это корректный код или нет? И почему некоторые компиляторы его не компилируют?


R>>корректный

BFE>Это точно? Я вот в чём не уверен:
BFE>
BFE>template<class... Parameter> // тут мы получили имя Parameter
BFE>template<Parameter... Value> // а тут разве Parameter... связан как-то с Parameter ? Вроде бы это независимые имена. Или нет? 
BFE>bool Outer<Parameter...>::Inner<Value...>::Member = true;
BFE>


Хороший вопрос. Но если его устранить — все равно гцц не компилит

template<class... Parameter> struct Outer
{
    template<Parameter... Value0> struct Inner
    {
        static bool Member;
    };

    template<Parameter... Value> 
    void f()
    {
        using Inn = Inner<Value...>; // error: expansion pattern 'Value0' contains no parameter packs
        //bool b = Inner<Value...>::Member;
    }
};
Re: Листал недавно stackoverflow, а там такое:
От: vopl Россия  
Дата: 24.09.20 16:44
Оценка:
Здравствуйте, B0FEE664, Вы писали:

BFE>Отсюда:

BFE>
BFE>template<class... Parameter> struct Outer
BFE>{
BFE>    template<Parameter... Value> struct Inner
BFE>    {
BFE>        static bool Member;
BFE>    };
BFE>};

BFE>template<class... Parameter>
BFE>template<Parameter... Value>
BFE>bool Outer<Parameter...>::Inner<Value...>::Member = true;

BFE>int main()
BFE>{
BFE>    Outer<int>::Inner<0>::Member = false;
BFE>    return 0;
BFE>}

BFE>


BFE>Это корректный код или нет? И почему некоторые компиляторы его не компилируют?



Судя по всему это не корректный код. В частности, эта конструкция
template<Parameter... Value>


Она не подходит под синтаксис, смотрю сюда https://en.cppreference.com/w/cpp/language/template_parameters
сразу можно сказать что это не template template parameter. Остается либо type template parameter, либо non-type template parameter.

Под non-type template parameter это не подходит, так как Parameter не является типом (это parameter pack с типами) и не является placeholder-ом.

Под type template parameter тоже не подходит, Parameter — это не type-parameter-key и не type-constraint..
Re[2]: Листал недавно stackoverflow, а там такое:
От: reversecode google
Дата: 24.09.20 16:52
Оценка: 6 (1)
https://en.cppreference.com/w/cpp/language/parameter_pack
[quote]Template parameter list
Pack expansion may appear in a template parameter list:

template<typename... T> struct value_holder
{
template<T... Values> // expands to a non-type template parameter
struct apply { }; // list, such as <int, char, int(&)[5]>
};[/quote]
Re[5]: Листал недавно stackoverflow, а там такое:
От: night beast СССР  
Дата: 24.09.20 17:16
Оценка:
Здравствуйте, B0FEE664, Вы писали:

BFE>Я могу и такое вот представить:

BFE>
BFE>template<typename T> 
BFE>template<int Value> // тут int и T как-нибудь связаны?
BFE>bool Outer<T>::Inner<Value>::Member = true;
BFE>


а теперь попроси свой компилятор это откомпилировать..
Re: Листал недавно stackoverflow, а там такое:
От: vopl Россия  
Дата: 25.09.20 09:10
Оценка: +1
Здравствуйте, B0FEE664, Вы писали:

BFE>Отсюда:

BFE>
BFE>template<class... Parameter> struct Outer
BFE>{
BFE>    template<Parameter... Value> struct Inner
BFE>    {
BFE>        static bool Member;
BFE>    };
BFE>};

BFE>template<class... Parameter>
BFE>template<Parameter... Value>
BFE>bool Outer<Parameter...>::Inner<Value...>::Member = true;

BFE>int main()
BFE>{
BFE>    Outer<int>::Inner<0>::Member = false;
BFE>    return 0;
BFE>}

BFE>


BFE>Это корректный код или нет? И почему некоторые компиляторы его не компилируют?


Тут нечто похожее https://gcc.gnu.org/bugzilla/show_bug.cgi?id=86883, подбросил еще дровишек..
Re[3]: Листал недавно stackoverflow, а там такое:
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 07.10.20 07:58
Оценка:
Здравствуйте, B0FEE664, Вы писали:

BFE>Это точно? Я вот в чём не уверен:

BFE>
BFE>template<class... Parameter> // тут мы получили имя Parameter
BFE>template<Parameter... Value> // а тут разве Parameter... связан как-то с Parameter ? Вроде бы это независимые имена. Или нет? 
BFE>bool Outer<Parameter...>::Inner<Value...>::Member = true;
BFE>


Всё тут корректно. Даже в старых стандартах аналогичное работало
Маньяк Робокряк колесит по городу
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.