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()
指向内存中的同一地址吗?
我问的原因是因为我的项目中有类似的代码,有时它可以工作,有时则不然.我假设两个指针都指向同一个位置,但我并没有真正有这个假设的基础:)
在C++ 11和C++ 14中:
在您的示例中array
有内部链接(请参阅[basic.link] /3.2),这意味着它将在不同的翻译单元中具有不同的地址.
因此,find
在不同的翻译单元中包含和调用是一种ODR违规(因为它的定义不同).
一个简单的解决方案是声明它extern
.
在C++ 17中:
[basic.link] /3.2已改变,使得constexpr
可以inline
在这种情况下将有上连杆没有影响了.
这意味着,如果您声明array
inline
它将具有外部链接,并且在翻译单元之间具有相同的地址.当然,与任何inline
翻译单元一样,它必须在所有翻译单元中具有相同的定义.
归档时间: |
|
查看次数: |
775 次 |
最近记录: |