gpt4 book ai didi

c++ - VS2012 上的 decltype 内没有 ADL

转载 作者:可可西里 更新时间:2023-11-01 17:56:57 25 4
gpt4 key购买 nike

我刚刚意识到尝试通过 decltype 获取函数的返回类型不涉及 VS2012 上的 ADL(参数依赖查找)(使用 cl.exe V17.00.60610.1 测试)。

下面的例子

#include <stdio.h>
#include <typeinfo>

namespace A {
int Func(void const *) {
printf("A::Func(void const *)\n");
return 0;
}

template <typename T> void Do(T const &t) {
Func(&t);
}
template <typename T> void PrintType(T const &t) {
printf("Type: %s\n", typeid(decltype(Func(&t))).name());
}
}

namespace B {
struct XX { };
float Func(XX const *) {
printf("B::Func(XX const *)\n");
return 0.0f;
}
}


int main(int argc, char **argv) {
B::XX xx;
A::Do(xx);
A::PrintType(xx);
return 0;
}

给予

B::Func(XX const *)
Type: int

在 VS2012 上

但是(预期是什么):

B::Func(XX const *)
Type: f

在 gcc 4.7.3 上。

所以 ADL 在调用函数时起作用(输出中的第 1 行),但在 VS2012 上的 decltype 内部使用时不起作用。

还是我漏掉了一些不同的点?

最佳答案

一个最小的测试用例是:

namespace N
{
struct C {};

C f(C) {};
}

N::C c1;

decltype(f(c1)) c2;

如果编译器不支持 decltype 中的 ADL,那么上面的代码将无法编译。

有人告诉我它确实可以编译,所以问题可能出在 ADL 和模板实例化之间的交互上。

关于c++ - VS2012 上的 decltype 内没有 ADL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17674804/

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