Std :: variant в контексте contexprC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Std :: variant в контексте contexpr

Сообщение Anonymous »

Следующий код не может быть составлен с некоторыми компиляторами (включая VS V19.20) < /p>

Код: Выделить всё

#include 

struct A {
int a;
bool b;
using T1 = int A::*;
using T2 = bool A::*;

using U = std::variant;

static constexpr const U  Ptrs[] = {
{&A::a}, {&A::b}
};
};
< /code>
vs output: < /p>
(23): error C2327: 'A::a': is not a type name, static, or enumerator
(23): error C2065: 'a': undeclared identifier
(23): error C2327: 'A::b': is not a type name, static, or enumerator
(23): error C2065: 'b': undeclared identifier
(24): fatal error C1903: unable to recover from previous error(s); stopping compilation
Аналогичный вывод происходит в случае использования пользовательского типа союза вложенного в

Код: Выделить всё

struct A {
int a;
bool b;
using T1 = int A::*;
using T2 = bool A::*;

template 
union MyUn {
T1 pA;
T2 pB;

constexpr MyUn(T1 a) : pA(a) {}
constexpr MyUn(T2 b) : pB(b) {}
};

using U = MyUn;

static constexpr const U  Ptrs[] = {
{&A::a}, {&A::b}
};
};
< /code>
, который кажется законным и поддерживается GCC: < /p>
:22:5: error: 'constexpr A::MyUn::MyUn(T1) [with T1 = int A::*; T2 = bool A::*]' used before its definition
Перемещение ptrs в местоположение, где является полным работ в обоих случаях, для всех компиляторов, что приводит к идее, что в первом случае шаблон std :: variant instansed как :: u в области класса A :

struct B : A {
static constexpr const U Ptrs[] = {
{&A::a}, {&A::b}
};
};
< /code>
Но GCC 15.1 отклоняет следующий код для любых типов T1 и T2: < /p>

Код: Выделить всё

struct B : A {
template 
union MyUn {
T1 pA;
T2 pB;

constexpr MyUn(T1 a) : pA(a) {}
constexpr MyUn(T2 b) : pB(b) {}
};

using U = MyUn;

static constexpr const U  Ptrs[] = {
{T1()}, {T2()}
};
};
является первым случаем разрешенным поведением, и я делаю что-то неопределенное \ Реализация, или это настоящая ошибка компилятора, разделяемая между некоторыми версиями и поставщиками?

Подробнее здесь: https://stackoverflow.com/questions/797 ... pr-context
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»