Сообщение Re[19]: Не могу понять ссылки в C++ от 01.07.2024 7:41
Изменено 01.07.2024 7:44 andrey.desman
Re[19]: Не могу понять ссылки в C++
Здравствуйте, rg45, Вы писали:
R>Этот пример работает на msvc, но не работает на gcc. Причем, не работает как раз вот тот самый "финт ушами", о котором я упоминал здесь
Тут gcc прав, а MSVC нет. Происходит примерно следущее (упростил):
Что такое лямбда-выражение? Это prvalue какого-то класса, который объявлен в ближайшем скоупе. Таким образом, условно это разворачивается в следущий код:
Ошибка возникает вне констрейнта. В нем нормальное выражение, которое ошибок не содержит.
Ну а в целом, проще использовать макросню а-ля boost::describe, там и имена есть.
R>Этот пример работает на msvc, но не работает на gcc. Причем, не работает как раз вот тот самый "финт ушами", о котором я упоминал здесь
Автор: rg45
Дата: 30.06 10:48
. gcc вместо того, чтобы продетектить невалидность выражения внутри констрейнта, с какого-то перепуга начинает диагностировать ошибки в этом выражении. Для меня такое поведение очень странно. Я с этим еще буду разбираться. Было бы здорово, если бы кто-нибудь посмотрел этот пример, особенно на код VisitStruct, возможно, будут идеи, как это можно усовершенствовать.Дата: 30.06 10:48
Тут gcc прав, а MSVC нет. Происходит примерно следущее (упростил):
#include <iostream>
template<typename T>
concept SomeConcept = requires(T t) {
[](T&& t){ auto&& [a, b, c] = t; };
};
struct Test {
int a, b;
};
int main() {
std::cout << SomeConcept<Test>;
return 0;
}
Что такое лямбда-выражение? Это prvalue какого-то класса, который объявлен в ближайшем скоупе. Таким образом, условно это разворачивается в следущий код:
#include <iostream>
struct AutoLambda123_Test {
void operator()(Test&& t) {
auto&& [a, b, c] = t;
}
};
template<typename T>
concept SomeConcept = requires(T t) {
AutoLambda123_Test{};
};
struct Test {
int a, b;
};
int main() {
std::cout << SomeConcept<Test>;
return 0;
}
Ошибка возникает вне констрейнта. В нем нормальное выражение, которое ошибок не содержит.
Ну а в целом, проще использовать макросню а-ля boost::describe, там и имена есть.
Re[19]: Не могу понять ссылки в C++
Здравствуйте, rg45, Вы писали:
R>Этот пример работает на msvc, но не работает на gcc. Причем, не работает как раз вот тот самый "финт ушами", о котором я упоминал здесь
Тут gcc прав, а MSVC нет. Происходит примерно следущее (упростил):
Что такое лямбда-выражение? Это prvalue какого-то класса, который объявлен в ближайшем скоупе. Таким образом, условно это разворачивается в следущий код:
Ошибка возникает вне констрейнта. В нем нормальное выражение, которое ошибок не содержит.
Ну а в целом, проще использовать макросню а-ля boost::describe, там и имена есть.
R>Этот пример работает на msvc, но не работает на gcc. Причем, не работает как раз вот тот самый "финт ушами", о котором я упоминал здесь
Автор: rg45
Дата: 30.06 10:48
. gcc вместо того, чтобы продетектить невалидность выражения внутри констрейнта, с какого-то перепуга начинает диагностировать ошибки в этом выражении. Для меня такое поведение очень странно. Я с этим еще буду разбираться. Было бы здорово, если бы кто-нибудь посмотрел этот пример, особенно на код VisitStruct, возможно, будут идеи, как это можно усовершенствовать.Дата: 30.06 10:48
Тут gcc прав, а MSVC нет. Происходит примерно следущее (упростил):
#include <iostream>
template<typename T>
concept SomeConcept = requires(T t) {
[](T&& t){ auto&& [a, b, c] = t; };
};
struct Test {
int a, b;
};
int main() {
std::cout << SomeConcept<Test>;
return 0;
}
Что такое лямбда-выражение? Это prvalue какого-то класса, который объявлен в ближайшем скоупе. Таким образом, условно это разворачивается в следущий код:
#include <iostream>
template<typename T>
concept SomeConcept = requires(T t) {
[](T&& t){ auto&& [a, b, c] = t; };
};
struct AutoLambda123_Test {
void operator()(Test&& t) {
auto&& [a, b, c] = t;
}
};
template<>
concept SomeConcept<Test> = requires(Test t) {
AutoLambda123_Test{};
};
struct Test {
int a, b;
};
int main() {
std::cout << SomeConcept<Test>;
return 0;
}
Ошибка возникает вне констрейнта. В нем нормальное выражение, которое ошибок не содержит.
Ну а в целом, проще использовать макросню а-ля boost::describe, там и имена есть.