【发布时间】:2015-03-01 00:56:30
【问题描述】:
我在理解 N3638 中描述的 auto 类型说明符的 C++14 扩展是如何实现的,以及究竟是什么是允许的。
具体来说,标准的更改之一是,
如果函数声明的返回类型包含占位符类型,则函数的返回类型是从函数体中的返回语句推导出来的。
当函数体与声明在同一个文件中时,很容易看出这是如何工作的;但考虑头文件使用auto 占位符声明方法但没有定义它的情况。包含此头文件但不包含定义方法的文件的翻译单元如何才能成功编译?
例如,给定文件foo.hpp:
class foo
{
public:
auto gen_data();
};
...和文件foo.cpp:
struct data_struct
{
int a;
int b;
int c;
double x;
char data[37];
};
auto foo::gen_data()
{
data_struct d;
// initialize members in d...
return d;
}
...和文件main.cpp:
#include "foo.hpp"
template<typename T>
double get_x(T f)
{
return f.gen_data().x;
}
int make_and_get_x()
{
foo f;
return get_x<foo>(f);
}
...自己编译main.cpp 是否合法?如果不是,为什么不呢?如果是这样,get_x 是如何实例化的,因为编译器无法知道gen_data 的返回类型是否有一个名为x 的成员,更不用说它的偏移量是多少?
不过,即使不担心模板实例化,这似乎也是个问题;例如,如果您尝试直接访问 f.gen_data().x 或将其传递给函数会发生什么?
【问题讨论】:
-
这是不合法的,因为编译器必须在每个需要它的翻译单元中推断返回类型(对于包含函数调用的表达式的类型)。但是,我不确定如何从标准中推断出来。
标签: c++ auto c++14 return-type-deduction translation-unit