如果我在program.cpp
中定义了一个函数:
constexpr bool isThree(const int number)
{
return number == 3;
}
与声明为静态有什么不同吗?
static constexpr bool isThree(const int number)
{
return number == 3;
}
这似乎应该等效,因为constexpr
表示该函数是内联的,因此不能在编译单元之间共享。
constexpr
全局函数隐式静态吗?
答案 0 :(得分:9)
vendor_id
函数隐式为constexpr
。
inline
是链接功能。在不同编译单元中具有定义的inline
函数不是错误;如果它们的定义不同,则程序的格式不正确,无需诊断,但是如果它们的定义相同,则将丢弃一个版本,而使用该版本。
inline
也是链接功能。 static
定义不会在其编译单元外部共享;编译单元不会“宣告”它具有static
的定义。
isThree
与链接无关。在这种情况下,这仅意味着static
没有隐式传递给函数。带有/不带有this
的方法不起作用有差异,但是它们与this
无关。请注意,至少在c++14中,不使用constexpr
的{{1}}方法仍可以进行常量评估。某些版本的c++隐式地使用constexpr
的方法this
; c++17不会。
constexpr
时(除非使用激进的ICF,这是一个不同的问题),一个编译单元中的 const
和另一个编译器中的&isThree
可以(通常这样做)变化。当&isThree
时,它们可能没有变化。
static
函数 在编译单元之间共享。它们的完整定义也经常在意识到这一点的所有编译单元中可见,因此,它使编译器“内联”(而不是关键字)更容易实现代码。 inline
不是。 inline
函数是隐式的static
,但不是隐式的constexpr
。
请注意,有时可以在运行时上下文中评估inline
函数。在编译时上下文中进行评估时,它们的static
与constexpr
或链接状态实际上无关紧要。
inline
也具有其他含义,但是您想知道两个不同的static
声明之间的区别,而这些含义都没有改变。
答案 1 :(得分:3)
constexpr
函数不是隐式静态的。它们具有与非constexpr
函数相同的链接:
// external linkage
constexpr int f1(int x) { /* ... */ }
// internal linkage
static constexpr int f2(int x) { /* ... */ }
// internal linkage
namespace {
constexpr int f3(int x) { /* ... */ }
}
// no linkage
void enclosing() {
struct S {
constexpr int f4(int x) { /* ... */ }
};
}
当constexpr
函数具有外部链接时,它在所有翻译单元中都具有相同的地址。当具有内部链接时,每个翻译单元中都有一个不同的副本,并且这些副本具有不同的地址。但是,我认为调用 constexpr
函数的结果不应该取决于它是否具有内部或外部链接(因为constexpr
函数可能不包含静态变量)。>