想要具有外部链接的字符串文字背后的主要动机是使用字符串文字作为非类型模板参数 https://stackoverflow.com/questions/5547852/string-literals-not-allowed-as-non-type-template-parameters.
我想像一个具有外部链接的字符串文字,其定义类似于
A 字符串字面量前缀中有 e 的是 a字符串字面量具有外部链接。
template<auto&> struct S{};
void bar()
{
S<e"foo"> s;
}
将具有相当于
template<auto&> struct S{};
constexpr char __foo[] = "foo";
void bar
{
S<__foo> s;
}
有没有理由不使用外部链接字符串文字?
是否以某种方式添加另一个前缀(例如e"Lorem Ipsum"
)使字符串文字具有外部链接有害吗?
注意:已经可以实现外部链接字符串,但这是一种非常糟糕的方法。
#include<boost/metaparse/v1/string.hpp>
template<typename>
struct hack;
template<char... Cs>
struct hack<boost::metaparse::v1::string<Cs...>>
{
static constexpr char arr[] = {Cs..., '\0'};
};
#define E(str) hack<BOOST_METAPARSE_STRING(str)>::arr
template<auto&> struct S{};
S<E("I'm an external linkage string")> s; // compiles
Boost 使用 python 脚本生成执行BOOST_METAPARSE_STRING
,那太可怕了。
这个问题在 C++20 中将变得毫无意义,因为P0732 非类型模板参数中的类类型 http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2018/p0732r0.pdf.
非类型模板参数是基本类型和类类型之间不对称的最后痕迹。它的存在不是通过选择,而是出于必然:尚不清楚链接器应该如何处理它们。
链接器需要能够区分两个模板类,为了做到这一点,它需要回答两个对象是否,a
and b
是平等的。对于基本类型来说这是微不足道的,但对于类类型来说,使用 C++20 之前可用的工具是无法解决的。
P0515一致比较 http://open-std.org/JTC1/SC22/WG21/docs/papers/2017/p0515r0.pdf给出了确定两个类类型对象是否相等的机制,只要它们具有简单的operator<=>
,具有成员比较的语义。
If P0732 http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2018/p0732r0.pdf通过,你将能够写
template<size_t N>
struct fixed_string
{
constexpr fixed_string(const char (&str)[N]) { std::copy(str, str + N, data); }
auto operator<=>(const fixed_string&, const fixed_string&) = default;
char data[N];
};
template<size_t N>
fixed_string(const char(&)[N]) -> fixed_string<N>;
template<fixed_string> struct S {};
S<"foo"> s;
也可以看看关于文本格式库的想法 http://zverovich.net/2018/03/17/text-formatting-jacksonville.html这也有利于进入 C++20。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)