Информация об изменениях

Сообщение Re[19]: Не могу понять ссылки в C++ от 01.07.2024 7:41

Изменено 01.07.2024 7:44 andrey.desman

Re[19]: Не могу понять ссылки в C++
Здравствуйте, rg45, Вы писали:

R>Этот пример работает на msvc, но не работает на gcc. Причем, не работает как раз вот тот самый "финт ушами", о котором я упоминал здесь
Автор: rg45
Дата: 30.06 10:48
. gcc вместо того, чтобы продетектить невалидность выражения внутри констрейнта, с какого-то перепуга начинает диагностировать ошибки в этом выражении. Для меня такое поведение очень странно. Я с этим еще буду разбираться. Было бы здорово, если бы кто-нибудь посмотрел этот пример, особенно на код VisitStruct, возможно, будут идеи, как это можно усовершенствовать.


Тут 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. Причем, не работает как раз вот тот самый "финт ушами", о котором я упоминал здесь
Автор: rg45
Дата: 30.06 10:48
. gcc вместо того, чтобы продетектить невалидность выражения внутри констрейнта, с какого-то перепуга начинает диагностировать ошибки в этом выражении. Для меня такое поведение очень странно. Я с этим еще буду разбираться. Было бы здорово, если бы кто-нибудь посмотрел этот пример, особенно на код VisitStruct, возможно, будут идеи, как это можно усовершенствовать.


Тут 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, там и имена есть.