我在理解N3638中描述的auto
類型說明符的C++ 14擴展如何實現以及允許的內容方面有些困難。使用返回在另一個翻譯單元中定義的佔位符類型的函數
具體變化爲標準人說,
如果函數的聲明的返回類型包含的佔位符類型,函數的返回類型從return語句中的身體推導功能,如果有的話。
當函數的主體與聲明位於同一個文件中時,很容易看出它是如何工作的;但考慮一下頭文件聲明使用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
或將它傳遞給函數會發生什麼?
這是不合法的,因爲編譯器必須在需要它的每個翻譯單元(包含函數調用的表達式的類型)中推導出返回類型。但是,我不確定如何從標準中推斷出這一點。 – dyp