首页 > 解决方案 > C++20 概念测试在 MSVS 16.5 中不起作用

问题描述

我是 C++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++ 语言标准。

标签: c++visual-studioc++20concept

解决方案


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相反,将其定义为。


推荐阅读