【问题标题】:Why does arguement dependent lookup not work for type aliasing in c++?为什么争论依赖查找不适用于 C++ 中的类型别名?
【发布时间】:2022-01-04 03:03:07
【问题描述】:

考虑以下最小示例,找不到function。依赖于参数的查找似乎失败了。为什么?

#include <iostream>
#include <array

namespace foo {
    using Values = std::array<int, 2>;
    void function(const Values& v) {std::cout << v[0] << " " << v[1] << '\n';}
}

int main() {
    foo::Values v{1,2};
    function(v);
    return 0;
}

一个可能的解决方案是通过将using foo::function; 放在main 上方来导入function。有没有替代方法可以避免这种 using 语句?

【问题讨论】:

  • 使用选项 1,v 的类型为 std::array&lt;int, 2&gt;。通过 typedef 赋予该类型的事实是无关紧要的。
  • 嗯,问题是关于被注释掉的代码,所以这不是一个最小的例子。显示不起作用的代码,而不是起作用的代码。
  • @IgorTandetnik 为什么不相关?我希望using 语句将名称Values(或std::array&lt;int,2&gt;)添加到命名空间foo,类似于在foo 中定义结构。
  • 您的预期不正确。用于 ADL 的关联命名空间是参数类型的属性,而不是在声明中碰巧命名该类型的别名。名称Values 在命名空间foo 中;但参数的类型是std::array&lt;int, 2&gt;,它在命名空间std 中,没有提到foo。所以ADL搜索std而不搜索foo
  • @IgorTandetnik 我会接受它作为“为什么”的答案。

标签: c++ typedef using argument-dependent-lookup


【解决方案1】:

类型别名就是这样:别名。它不是一个单独的类型,因此它不会真正影响 ADL 规则。

您可以在您的示例中将v 的声明更改为std::array&lt;int, 2&gt; v{1,1},它会产生相同的效果。

【讨论】:

  • 别名的重点不是在更一般的上下文中写std::array&lt;int,2&gt;。好的,它不是一种类型,但在这种情况下我可以让它被这样对待吗?
  • 是的,我根本不会争论你对别名的使用——我在提到这个“替换”操作时的意思是要确定这两个版本是 100% 相同的东西——即使考虑 ADL。
  • 丑陋的解决方法是简单地创建一个新类并公开继承自std::array&lt;int, 2&gt;。我不喜欢它,所以我真的不想将它添加到这个答案中。
猜你喜欢
  • 2019-12-07
  • 2010-10-13
  • 1970-01-01
  • 2020-04-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-25
  • 1970-01-01
相关资源
最近更新 更多