标题中的constexpr数组

roz*_*ina 5 c++ pointers constexpr

我在头文件中有以下代码,它包含在2个不同的cpp文件中:

constexpr int array[] = { 11, 12, 13, 14, 15 };
inline const int* find(int id)
{
    auto it = std::find(std::begin(array), std::end(array), id);
    return it != std::end(array) ? &*it : nullptr;
}
Run Code Online (Sandbox Code Playgroud)

然后我调用find(13)每个cpp文件.将两个指针返回find()指向内存中的同一地址吗?

我问的原因是因为我的项目中有类似的代码,有时它可以工作,有时则不然.我假设两个指针都指向同一个位置,但我并没有真正有这个假设的基础:)

rus*_*tyx 7

在C++ 11和C++ 14中:

在您的示例中array内部链接(请参阅[basic.link] /3.2),这意味着它将在不同的翻译单元中具有不同的地址.

因此,find在不同的翻译单元中包含和调用是一种ODR违规(因为它的定义不同).

一个简单的解决方案是声明它extern.

在C++ 17中:

[basic.link] /3.2已改变,使得constexpr可以inline在这种情况下将有上连杆没有影响了.

这意味着,如果您声明array inline它将具有外部链接,并且在翻译单元之间具有相同的地址.当然,与任何inline翻译单元一样,它必须在所有翻译单元中具有相同的定义.