Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/148.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在匿名名称空间中定义全局constexpr变量与使其内联相同吗?_C++_C++17_Inline Variable - Fatal编程技术网

C++ 在匿名名称空间中定义全局constexpr变量与使其内联相同吗?

C++ 在匿名名称空间中定义全局constexpr变量与使其内联相同吗?,c++,c++17,inline-variable,C++,C++17,Inline Variable,接下来,如果我创建自己的类型trait并希望避免ODR冲突,并希望它与C++17之前的项目兼容,那么将xxx_v快捷方式放在匿名命名空间中是否与显式内联声明相同 例如,从中获取all\u true,使用C++17,我可以在我的实用程序头中编写: template <bool...> struct bool_pack; template <bool... v> using all_true = std::is_same<bool_pack<true, v...&

接下来,如果我创建自己的类型trait并希望避免ODR冲突,并希望它与C++17之前的项目兼容,那么将xxx_v快捷方式放在匿名命名空间中是否与显式内联声明相同

例如,从中获取
all\u true
,使用C++17,我可以在我的实用程序头中编写:

template <bool...> struct bool_pack;
template <bool... v>
using all_true = std::is_same<bool_pack<true, v...>, bool_pack<v..., true>>;
template <bool... v>
inline constexpr bool all_true_v = all_true<v...>::value;
模板结构文件包;
模板
使用all_true=std::is_same;
模板
inline constexpr bool all\u true\u v=all\u true::value;
这与编写以下与C++17之前版本兼容的代码相同吗

template <bool...> struct bool_pack;
template <bool... v>
using all_true = std::is_same<bool_pack<true, v...>, bool_pack<v..., true>>;
namespace {
   template <bool... v>
   constexpr bool all_true_v = all_true<v...>::value;
}
模板结构文件包;
模板
使用all_true=std::is_same;
名称空间{
模板
constexpr bool all\u true\u v=all\u true::value;
}
考虑

    bool const* g_b= &all_true_v<true>;
bool const*g\u b=&all\u true\u v;
对于
内联constexpr
版本,每个翻译单元中的地址都相同,但是
名称空间{}
版本的地址不同。

    bool const* g_b= &all_true_v<true>;
bool const*g\u b=&all\u true\u v;

对于
内联constexpr
版本,它在每个翻译单元中的地址相同,但是
名称空间{}
版本的地址不同。

您确实避免了匿名名称空间的ODR冲突,因为它在包含它的每个文件中创建了一组新的单独对象。
inline
对象的优点是总共只有一个

但是,如果仅将
constepr
值用作常量,则不会注意到太多差异。一个好的编译器可能会避免在数据区域中存储常量


正如托比所说,传递引用或指针并比较地址可能会有所不同。但是,也许您可以避免比较两个常量值的地址?

您确实可以避免匿名名称空间与ODR冲突,因为它会在包含ODR的每个文件中创建一组新的单独对象。
inline
对象的优点是总共只有一个

但是,如果仅将
constepr
值用作常量,则不会注意到太多差异。一个好的编译器可能会避免在数据区域中存储常量


正如托比所说,传递引用或指针并比较地址可能会有所不同。但也许您可以避免比较两个常量值的地址?

未命名的命名空间提供了内部链接中的所有内容。。。而
all\u true\u v
无论如何都有内部链接,原因与@Oliv在你的另一个问题上引用的相同(C++14中的相同项目符号)。因此,您提供的两个代码片段根本不兼容。@当然是StoryTeller。我搞砸了。未命名的名称空间提供了内部链接中的所有内容。。。而
all\u true\u v
无论如何都有内部链接,原因与@Oliv在你的另一个问题上引用的相同(C++14中的相同项目符号)。因此,您提供的两个代码片段根本不兼容。@当然是StoryTeller。我的错误。