我需要写一个constexpr地址的函数,但我发现它是不可能的.有谁知道这是否可能?
cppreference.com上的参考实现:
template< class T >
T* addressof(T& arg)
{
return reinterpret_cast<T*>(
&const_cast<char&>(
reinterpret_cast<const volatile char&>(arg)
)
);
}
Run Code Online (Sandbox Code Playgroud)
使用reinterpret_cast(类似于GCC实现),所以它不会这样做.我可以看到最新的C++标准草案,N3485也不要求addressof()是constexpr,即使很多函数形成头<utility>最近已升级到constexpr.
一个可能的,虽然不是很有说服力或有用的用例,它将是:
constexpr MyType m;
constexpr MyType const* p = &m; // this works today
constexpr MyType const* p = addressof(m); // this is my question
Run Code Online (Sandbox Code Playgroud)
想象一下,MyType重载了operator&.
C++20<chrono>库附带本地时间和时区支持。该库的接口与IANA 时区数据库的接口兼容,但问题是,C++ 标准是否要求实现实际使用 IANA 时区数据库及其所有历史数据?
在线 C++ 参考声称确实如此:请参阅此处。C++ 标准本身包含一个较弱的声明:
\n\n\n[time.zone] 描述用于访问 IANA 时区数据库的接口,该数据库与 sys_\xc2\xadtime 和 local_\xc2\xadtime 互操作。\n此接口为两种民用日历类型 ([time.cal]) 提供时区支持以及用户定义的日历。
\n
它只提到了接口,但没有提到数据。标准中对时区库的后续描述不再进一步引用 IANA 时区数据库。
\n我的结论是C++ Reference是错误的,并且不需要实现就可以使用IANA时区数据库。有人可以确认这个结论是否正确吗?
\n我想在Clang中编写一个"可移植"的C++库."可移植"意味着我检测(在C预处理器中)编译环境中可用的C++功能并使用这些功能或提供我的解决方法.这类似于Boost库正在做的事情.
但是,某些功能的存在不取决于语言,而是取决于标准库实现.我特别感兴趣的是:
initializer_list是constexpr.我发现这有问题,因为默认情况下Clang不使用自己的标准库实现:它使用libstdc ++.虽然锵有预定义的预处理宏__GNUC__,__GNUC_MINOR__,__GNUC_PATCHLEVEL__,它们分别硬编码值4,2,1,他们告诉我一些关于可用的libstdc ++的功能.
如何在Clang预处理器中检查它使用的libstdc ++版本?
Cppreference 提到函数current_zone()是<chrono>. 这个功能在 GCC 或 Clang 中实现了吗?我想在在线工具之一中测试它,例如https://wandbox.org或https://godbolt.org/,但它似乎丢失了。