在头文件中前向声明一个constexpr函数

5

假设我有以下文件。这是无效的C ++(链接器会出错),还是我的语法错误?constexpr函数的前向声明必须在与其定义相同的文件中吗?请注意,以下是需要翻译的内容:

header.h

extern constexpr int fun(int);

source.cpp

constexpr int fun(int x) 
{
    return x * 2; 
}

@NathanOliver:相关但不同的规则适用于函数和类。这不是重复内容。 - Ben Voigt
@BenVoigt 这就是为什么我没有实际投票。不过答案应该是可行的。 - NathanOliver
1个回答

16

这是错误的。 constexpr 意味着函数是内联的。内联函数必须在每个调用它的翻译单元中定义。如果你在除了 source.cpp 以外的翻译单元中包含该头文件并使用该函数,则该翻译单元将缺少该函数的定义。

因此,解决方案是将实现移至头文件中。不需要担心多重定义,因为该函数是内联的。

技术上讲,它并不一定要在同一个文件中,但由于定义必须在每个使用该函数的文件中都存在,所以在同一个头文件中定义是最简单的。


2
extern inline 是可以的,但是 extern 默认就是多余的。 - T.C.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接