C++20 概念测试在 MSVS 16.5 中不起作用
C++20 Concept test not working in 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 not defined
但我得到:
toString not defined
toString not defined
在这么简单的例子中我做错了什么?我已将 std:c++最新选为 C++ 语言标准。
concept has_toString = requires(const T & t)
{
t.toString();
};
由于t
是一个const
对象,它的toString()
方法必须是const
方法。这与概念没有直接关系,但与 C++ class 方法甚至在 C++11 之前的工作方式有关。
struct hasToString
{
string toString()
{
当然,这个 toString()
不是 const
class 方法。将其定义为 string toString() const
,而不是
我是 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 not defined
但我得到:
toString not defined
toString not defined
在这么简单的例子中我做错了什么?我已将 std:c++最新选为 C++ 语言标准。
concept has_toString = requires(const T & t)
{
t.toString();
};
由于t
是一个const
对象,它的toString()
方法必须是const
方法。这与概念没有直接关系,但与 C++ class 方法甚至在 C++11 之前的工作方式有关。
struct hasToString
{
string toString()
{
当然,这个 toString()
不是 const
class 方法。将其定义为 string toString() const
,而不是