【发布时间】:2018-05-28 18:12:49
【问题描述】:
以下代码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++ 上面写了什么?
【问题讨论】:
-
这基本上是你在任何标题中所做的......
-
@Jaa-c 听起来可能很傻,但我之前从未在头文件中使用不完整类型作为函数返回类型或参数类型。
-
这个想法是你不会让每个可能间接包含你的标题的人也必须解析它使用的每种类型的完整定义,因为他们可能不要使用需要所述定义的函数。如果他们做,那么他们可以自己包含完整的定义。不过,我认为对你的用户的期望是否好,争论会永远激烈地进行。对于内部使用的标头,我会说这是不费吹灰之力。
标签: c++ language-lawyer c++17 return-type incomplete-type