c++ - 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++ 语言标准。
解决方案
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
相反,将其定义为。
推荐阅读
- c - free() 给了我一个错误,从聊天到无效的对话无效
- python - 在python中删除文件名的结尾
- typescript - 如何有条件地设置可选属性
- angular - 如何使用 [innerHtml] Angular 2 绑定到样式属性?
- regex - 如何在点之前只匹配 2 位数字,在点之后只匹配一位或两位数字
- heroku - 如果我在 Heroku 上拥有超过 5 个应用程序,我需要付费吗?
- javascript - 如何使用委托从本地存储中删除项目?
- reactjs - 数据数组更改时 Select2 不更新
- c# - 突出显示具有空字符串属性的行
- android - ARCore SceneForm HDR 房间图像