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

Con*_*tor 8 c++ return-type language-lawyer incomplete-type c++17

以下代码使用clang ++ 5.0.0g ++ 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{});
}
Run Code Online (Sandbox Code Playgroud)

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

Bar*_*rry 9

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

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

但是函数声明没有这样的限制.当你定义Bar::getBar::set,Foo是一个完整的类型,所以程序是好的.