返回参数的Typename查找

mka*_*aes 7 c++

最近我被学生问到编译问题.答案很简单,但现在我正在努力解决这个问题.一个简单的例子:

#include <iostream>
#include <vector>

struct MyStruct
{
    typedef std::vector<int> MyIntVector;

    MyIntVector CopyVector(MyIntVector const& vector);
};


MyStruct::MyIntVector MyStruct::CopyVector(MyIntVector const& vector)
^^^^^^^^
{
    MyIntVector vec;
    return vec;
}

int main(int /*argc*/, char** /*argv*/)
{
    MyStruct st;
}
Run Code Online (Sandbox Code Playgroud)

要成为有效的c ++代码,return参数必须是完全限定的.这么多的答案,让编译器/学生高兴.

但是为什么返回值要用类和函数的参数来限定?

我总是这样做,我知道它与ADL查找有关,但现在我被问到我在寻找更好的答案.
任何人都可以给我参考规格或提示我可以找到更多信息吗?

APr*_*mer 7

语法的结构使得返回类型与声明的内容无关,并且可以声明(但不定义)具有相同类型的几个事物.这是有效的C++:

int f(int), g(int);
Run Code Online (Sandbox Code Playgroud)

因此,具有影响查找类型的声明对象的精确范围将是有问题的.在

id1 ns1::f(int), ns2::g(int);
Run Code Online (Sandbox Code Playgroud)

id1会在哪里查找?

可以在函数定义中添加特殊规则(可能只有一个函数定义 - 所以不会有歧义 - 但可以是几个对象),但我不确定是否已经检查过这种可能性,我认为增加的并发症不会得到优势的补偿.