为什么类成员的类型推导失败?

Afs*_*hin 2 c++ c++17

假设我们有这样的小代码:

template<typename T>
struct Test {
    Test(T t) : m_t(t) {}
    T m_t;
};

int main() {
    Test t = 1;
}
Run Code Online (Sandbox Code Playgroud)

这段代码很容易用[T=int]for Testclass 进行编译。现在如果我写这样的代码:

template<typename T>
struct Test {
    Test(T t) : m_t(t) {}
    T m_t;
};

struct S {
    Test t = 1;
};

int main() {
    S s;
}
Run Code Online (Sandbox Code Playgroud)

此代码无法编译并出现以下错误:

invalid use of template-name 'Test' without an argument list
Run Code Online (Sandbox Code Playgroud)

我需要像Test<int> t = 1;班员一样写它才能工作。知道为什么会发生这种情况吗?

Nat*_*ica 8

原因

struct S {
    Test t = 1;
};
Run Code Online (Sandbox Code Playgroud)

不起作用是因为你实际上没有做Test t = 1;。类内初始化程序只是一种方便的方法,可以告诉编译器t在未提供值时使用什么值进行初始化。“实际”生成的是

struct S {
    S() : t(1) {} // created by the compiler
    Test t;
};
Run Code Online (Sandbox Code Playgroud)

在这里您可以更容易地看到t在调用构造函数之前没有使用初始值设定项指定。