Ошибка зависимого имени при отброшенном экземпляре if-constexpr шаблона функции или универсальной лямбдыC++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Anonymous
 Ошибка зависимого имени при отброшенном экземпляре if-constexpr шаблона функции или универсальной лямбды

Сообщение Anonymous »

Насколько я понимаю, поиск зависимого имени не происходит до создания экземпляра шаблона, а вызовы шаблона в отброшенном операторе if-constexpr не создаются. Таким образом, я ожидаю, что шаблон или обобщенная лямбда-выражение, имеющая неверный формат из-за отсутствия зависимых имен, не будет вызывать ошибок компиляции, пока они используются только в отброшенных операторах if-constexpr. Похоже, что в некоторых случаях это так и есть. Например, возьмем:
struct Struct {};
Struct s;

template
void foo(T& s) {
s.non_existing_member = 0;
}

struct A {
template
void operator()(T& s) { // note 'void' return type
s.non_existing_member = 0;
}
};

struct B {
template
auto operator()(T& s) { // note 'auto' return type
s.non_existing_member = 0;
}
};

Как и ожидалось, ошибки компиляции не возникают:
if constexpr (false) {
foo(s);
A{}(s);
}

[](auto& s) {
if constexpr (false) {
s.non_existing_member = 0;
}
}(s);

Однако они жалуются на пропавшего участника:
if constexpr (false) {
auto bar = [](auto& s) {
s.non_existing_member = 0;
};

// error: no member named 'non_existing_member' in 'Struct'
// bar(s); // note: in instantiation of function template specialization 'main()::(anonymous class)::operator()'
// B{}(s); // note: in instantiation of function template specialization 'B::operator()' requested here
}

Я не совсем понимаю, чем отличаются два приведенных выше случая. Я получаю аналогичные ошибки, ссылающиеся на имена зависимых типов, например. имя типа T::Type. Явное указание параметра шаблона универсальной лямбды (C++20) и возвращаемого типа void также не работает:
auto bar = [](T& s) -> void {
s.non_existing_member = 0;
};


Подробнее здесь: https://stackoverflow.com/questions/784 ... on-templat
Реклама
Ответить Пред. темаСлед. тема

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

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

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

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

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

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