gpt4 book ai didi

c++ - 字符串文字不能有外部链接是否有原因?

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:22:02 24 4
gpt4 key购买 nike

想要具有外部链接的字符串文字背后的主要动机是 to use string literals as non-type template parameters .

我会想象一个带有外部链接的字符串文字,其定义类似于

A string-literal that has an e in the prefix is a string-literal with external linkage.

template<auto&> struct S{};
void bar()
{
S<e"foo"> s;
}

will have behaviour equivalent to

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 的实现,这很糟糕。

最佳答案

由于 P0732 class types in non-type template parameters,这个问题在 C++20 中变得没有实际意义.

非类型模板参数是基本类型和类类型之间不对称的最后痕迹。它的存在不是出于选择,而是出于必然:目前尚不清楚链接器应该如何处理它们。

链接器需要能够区分两个模板类,为了做到这一点,它需要回答两个对象,ab是平等的。这对于基本类型来说是微不足道的,但对于使用 C++20 之前可用的工具的类类型来说是无法解决的。

P0515 consistent comparison给出了确定两个类类型对象是否相等的机制,前提是它们具有平凡的 operator<=> , 具有成员比较的语义。

如果P0732通过,你就可以写

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;

另见 thoughts on the text formatting library这也有利于进入 C++20。

关于c++ - 字符串文字不能有外部链接是否有原因?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44684103/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com