gpt4 book ai didi

c++ - 为什么这个构造函数没有给出不完整的类型错误?

转载 作者:IT老高 更新时间:2023-10-28 23:00:53 30 4
gpt4 key购买 nike

我有两个文件 test.h 和 main.cpp 如下所示:

test.h

#include <memory>

class TestImpl;

template <typename... T>
void createConnection(T&&... Args)
{
// 1. Why is this working if the constructor is in cpp?
std::unique_ptr<TestImpl> pimpl(new TestImpl(std::forward<T>(Args)...));
std::cout << "Done..." << std::endl;

// 2. Why is this not working if the constructor call has no issues?
pimpl->sayHello();
}

main.cpp

#include <iostream>

#include "test.h"

class TestImpl
{
public:
TestImpl(const std::string& first, const std::string& second)
: _first(first)
, _second(second)
{
}

void sayHello()
{
std::cout << "Hello ... " << std::endl;
}

private:
std::string _first;
std::string _second;
};

int main()
{
std::cout << "Hello World!" << std::endl;
createConnection("ABC", "DEF");
return 0;
}

从评论中可以明显看出,我的主要问题是为什么构造函数调用没有给出错误“无效使用不完整类型'class TestImpl'...”。作为引用,我使用的是 GCC 5.2,没有特定的标志。

最佳答案

简单地说,GCC 不必拒绝你的程序,Clang 也不必接受它。它的格式不正确,不需要诊断。由于 TestImpl 不完整,你的模板违反了

[temp.res]/8

... The program is ill-formed, no diagnostic required, if:

  • a hypothetical instantiation of a template immediately following its definition would be ill-formed due to a construct that does not depend on a template parameter, or
  • the interpretation of such a construct in the hypothetical instantiation is different from the interpretation of the corresponding construct in any actual instantiation of the template.

有人可能会说被调用的构造函数是依赖的,但类名肯定不是!

在我们的例子中,在模板定义之后立即使用一组两个字符串的假设实例化将产生与程序中实例化点不同的结果。这是因为类名本身(同样不依赖)在两种上下文中具有不同的含义。

这不是一个有效的模板定义。但是 GCC 在这里有一些回旋余地,因为不需要诊断,并且继续前进。


这在项目符号下的注释中得到了简洁的总结,虽然不规范,但描述了您的情况:

This can happen in situations including the following:

  • a type used in a non-dependent name is incomplete at the point at which a template is defined but is complete at the point at which an instantiation is performed, or

关于c++ - 为什么这个构造函数没有给出不完整的类型错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51931749/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com