C&C++   发布时间:2022-04-03  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了c – 概念和申报单大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
我一直在试验SVN GCC中的概念.我遇到一个我怀疑是由于我缺乏理解的问题,如果有人能指出我正确的方向,我会感激的.我的代码是:
#include <iostream>
#include <String>

// Uncomment this declaration to change behavIoUr
//void draw(const std::string&);

template <typename T>
concept bool Drawable() {
    return requires (const T& t) {
        { draw(t) }
    };
}

void draw(const std::string& s)
{
    std::cout << s << "\n";
}

int main()
{
    static_assert(Drawable<std::string>()); // Fails
}

在这里我定义一个简单的概念,Drawable,它的目的是要求给定一个类型为const T&,draw(t)的编译参数.

然后我定义一个函数draw(const std :: String&),它将字符串“绘制”为cout.最后,我检查std :: String是否匹配Drawable概念 – 我本来会期望它,因为在调用static_assert时,适当的draw()函数在范围内.

但是,静态断言失败,除非我在概念定义之前包含一个draw(const std :: String&)声明,而且我不知道为什么.

这是预期的行为与概念,还是我做错了?

解决方法

这个问题与ADL毫无关系),只是通过名称查找. GCC使用的概念草案是n4377,但是我将使用的C标准草案是n4140.首先,在潜入标准之前,我们可以将您的问题变成我们知道应该运作的形式的MCVE.例:
template<typename T> concept bool C =
  requires (T a,T b) {
    a + b;
  };

这是一个简单的要求,[exPR.prim.req.simple],它检查表达式的有效性.重写我们的示例以匹配表单:

template<typename T> concept bool Drawable = 
  requires (const T& X) { 
    draw(X); 
  };

我们可以看到我们的语法很好.好的,n4377怎么说?

说得通.我们知道包围的上下文是全局命名空间,所以n4140说什么?

由于这个概念适用于该功能,所以上面的段落适用.

大佬总结

以上是大佬教程为你收集整理的c – 概念和申报单全部内容,希望文章能够帮你解决c – 概念和申报单所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。
标签:c概念