不完整类型作为函数参数和返回值

时间:2017-12-14 15:34:36

标签: c++ language-lawyer c++17 return-type incomplete-type

以下代码compiles successfully both with clang++ 5.0.0 and g++ 7.2(带有-std=c++17 -Wall -Wextra -Werror -pedantic-errors -O0编译标志):

struct Foo;

struct Bar
{
    Foo get() const;

    void set(Foo);
};

struct Foo
{
};

Foo Bar::get() const
{
    return {};
}

void Bar::set(Foo)
{
}


int main()
{
    Bar bar{};

    (void)bar.get();
    bar.set(Foo{});
}

将不完整类型用作函数参数并返回值是否有效? C ++对此有何评论?

3 个答案:

答案 0 :(得分:8)

在函数定义中,您不能使用不完整类型:[dcl.fct]/12

  

除非删除该函数,否则函数定义的参数类型或返回类型在函数定义的上下文中不应是不完整的(可能是 cv - 限定的)类类型。 / p>

但是函数声明没有这样的限制。当您定义Bar::getBar::set时,Foo是完整类型,因此程序很好。

答案 1 :(得分:3)

  

将不完整类型用作函数参数并返回值是否有效? C ++对此有何评论?

在函数声明中,是的,它是有效的。

[basic.def.odr]列出了必须完成类型的情况。该列表中没有提及函数声明。请注意,函数定义确实需要T的定义用于T的参数和返回类型。

答案 2 :(得分:0)

据我所知,您可以通过以下方式使用不完整类型:

  1. 作为指针;
  2. 作为参考;
  3. 因为函数的声明不会创建任何对象,所以它是合法的。