昨天,当我能够编译具有使用以下方法的代码时,我感到(愉快地)惊讶:使用类型别名即使别名的声明直到稍后才在类定义中声明。
- 类型别名的这种“前向”用法是否有效? (我认为是这样,因为 Clang 5 和 GCC 4.9 都是这样工作的。)
- 什么规则涵盖了这种行为以及方法主体和方法签名用法之间的差异?
情况 #1 - 使用在方法后声明的方法,在方法体内有效(仅?)
#include <string>
#include <iostream>
struct X {
std::string create() { // fails to compile if Y used in signature
return Y{"hello!"}; // compiles when Y here
}
using Y = std::string; // declared at bottom
};
int main()
{
std::cout << X().create() << std::endl;
}
情况#2 - 使用上面声明的签名[也]有效
#include <string>
#include <iostream>
struct X {
using Y = std::string; // declared at top
Y create() { // can use Y here as well
return Y{"hello!"};
}
};
int main()
{
std::cout << X().create() << std::endl;
}
这与完整的类上下文。当您处于成员函数的主体中时,该类被认为是完整的,并且可以使用类中定义的任何内容,无论它是在类中的何处声明的。
成员函数的返回类型不属于完整的类上下文因此您只能使用代码中此时已知的名称。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)