Концептуальный тест С++ 20 не работает в MSVS 16.5

Я новичок в концепции С++ 20, но из примеров, которые я видел, этот код должен работать...

#include <iostream>
#include <string>
#include <concepts>
#include <memory>

using namespace std;

struct hasToString
{
    string toString()
    {
        return __FUNCTION__;
    }
};

struct noToString
{
};

template<typename T>
concept has_toString = requires(const T & t)
{
    t.toString();
};

template<typename T>
string optionalToString(const T &obj)
{
    if constexpr (has_toString<T>)
        return obj.toString();
    else
        return "toString not defined";
}

int main()
{
    hasToString has;
    unique_ptr<noToString> hasnt = make_unique<noToString>();

    cout << optionalToString(has) << '\n';
    cout << optionalToString(hasnt) << '\n';
}

Ожидаемый результат:

hasToString::toString

toString не определен

но вместо этого я получаю:

toString не определен

toString не определен

Что я делаю не так в таком простом примере? Я выбрал std:c++latest в качестве стандарта языка C++.


person Geoffrey Hoffmann    schedule 22.05.2020    source источник


Ответы (1)


concept has_toString = requires(const T & t)
{
    t.toString();
};

Поскольку t является объектом const, его метод toString() должен быть методом const. Это напрямую связано не с концепциями, а с тем, как методы класса C++ работали еще до C++11.

struct hasToString
{
    string toString()
    {

И, конечно же, этот toString() не является методом класса const. Вместо этого определите его как string toString() const.

person Sam Varshavchik    schedule 22.05.2020
comment
Вот именно. Спасибо за решение. - person Geoffrey Hoffmann; 22.05.2020