gpt4 book ai didi

c++ - 参数相关的查找和函数模板

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:45:18 26 4
gpt4 key购买 nike

<分区>

这是一个例子:

#include <string>
#include <algorithm>
#include <memory>

using std::string;

int main()
{
string str = "This is a string";

// ok: needn't using declaration, ADL works
auto it = find(str.begin(), str.end(), 'i');

// error: why ADL doesn't work?
std::shared_ptr<string> sp = make_shared<string>(str);
}

当我尝试编译这个程序时,编译器报错:

error: no template named 'make_shared'; did you mean 'std::make_shared'?
std::shared_ptr<string> sp = make_shared<string>(str); // error...
^~~~~~~~~~~
std::make_shared

我猜第一个函数 find 不需要 using 声明,因为参数相关的查找(ADL):编译器会搜索string 所在的命名空间(即 std),用于定义 find。但是对于第二个函数 make_shared,似乎 ADL 不起作用:我必须使用 std::make_sharedusing 声明代替。我知道两个函数模板的定义是不同的:前者将其模板参数之一(typename T 或类似的东西)作为函数参数类型并返回相同的类型。后者以函数参数包作为函数参数,其返回类型是另一个模板参数。这种差异是否会禁用 ADL?或者你能帮忙回答问题并提供一些引用吗?

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com