C++20 的概念测试在 MSVS 16.5 中无法工作。

4

我对C++20中的概念(concept)还不太熟悉,但从我看到的示例中,这段代码应该能够正常工作...

#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++ 语言标准。

1个回答

3
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


没错,就是这样。感谢您提供的解决方案。 - Geoffrey Hoffmann

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接