【发布时间】:2018-11-20 12:55:09
【问题描述】:
以下代码按预期失败,因为没有找到 get 的重载。使用std::get会解决问题。
#include <array>
int main()
{
std::array<int, 2> ar{2,3};
auto r = get<0>(ar);//fails, get was not declared in this scope
}
然而,引入get 的模板版本,即使它与函数调用不匹配,编译器也会以某种方式使用std::get 版本:
#include <array>
template <typename T>
void get(){};
int main()
{
std::array<int, 2> ar{2,3};
auto r = get<0>(ar);//returns 2
}
我找不到解释这一点的标准的任何部分。这是我测试的所有 3 个编译器中的一个错误(可能不是),还是我遗漏了什么?
此行为已在
中进行了测试- MSVC 15.9.2
- Clang 8.0.0
- GCC 9.0.0(仍是实验版本)
编辑: 我知道 ADL。但是如果 ADL 使第二个代码工作,为什么它不能在第一部分呢?
【问题讨论】:
-
被 ADL 发现。似乎在不提供该声明的情况下阻止了 ADL,.
-
我怀疑 ADL。但是,它并没有解释为什么没有 fake-template ADL 就不能工作
-
或者,只是不要给标准库中已经存在的函数名称。
-
@jfh 糟糕的建议。不要试图解决命名空间已经为您解决的问题。
-
@LcdDrm 作为我自己的练习,我编写了您描述的上述功能。如果你喜欢,我可以和你分享。