Насколько я понимаю, поиск зависимого имени не происходит до создания экземпляра шаблона, а вызовы шаблона в отброшенном операторе 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
Ошибка зависимого имени при отброшенном экземпляре if-constexpr шаблона функции или универсальной лямбды ⇐ C++
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение