gpt4 book ai didi

c++ - 折叠表达式和函数名称查找

转载 作者:行者123 更新时间:2023-12-01 14:07:36 25 4
gpt4 key购买 nike

我正在学习 C++17 中的折叠表达式。我有以下代码

#include <iostream>
#include <vector>

namespace io {
template<typename T>
std::istream &operator>>(std::istream &in, std::vector<T> &vec) {
for (auto &x : vec)
in >> x;
return in;
}

template<class... Args> void scan(Args &... args) {
(std::cin >> ... >> args);
}
}// namespace io

int main() {
std::vector<int> s(1), t(1);
io::scan(s, t);
std::cout << s[0] << ' ' << t[0] << '\n';
}

使用 GCC 9.3.0 ,代码编译并正确运行,但使用 Clang 10.0.0 ,同样的代码不能编译:
<source>:13:16: error: call to function 'operator>>' that is neither visible in the template definition nor found by argument-dependent lookup
(std::cin >> ... >> args);
^
<source>:19:9: note: in instantiation of function template specialization 'io::scan<std::vector<int, std::allocator<int> >, std::vector<int, std::allocator<int> > >' requested here
io::scan(s, t);
^
<source>:6:15: note: 'operator>>' should be declared prior to the call site
std::istream &operator>>(std::istream &in, std::vector<T> &vec) {
^
1 error generated.

为什么 clang 拒绝代码但 gcc 接受它?

最佳答案

这是一个 Clang 错误。 Clang 版本 11 及更早版本没有正确实现折叠表达式中运算符的两阶段名称查找,并且会错误地从恰好执行折叠表达式实例化的词法范围内执行第一阶段查找,而不是从模板定义的上下文中进行第一阶段查找。
fixed this相对最近(不幸的是没有及时发布即将发布的 Clang 11),测试用例现在是 accepted by Clang trunk .

关于c++ - 折叠表达式和函数名称查找,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62421234/

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