gpt4 book ai didi

c++ - 结构类型为 NTTP : why must all members be public?

转载 作者:行者123 更新时间:2023-12-02 09:50:57 27 4
gpt4 key购买 nike

在下面的例子中

template<auto V>
struct A {};

struct B {
constexpr B(int a) : value{a} {}
private:
int value{0};
};

int main() {
constexpr B b{0};
A<b> t2;
}

成员(member) value必须公开才能创建类型 B结构将其用作 A 的 NTTP .

那么,没有私有(private)成员的类型可以用作 NTTP 吗?
这是 http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2019/p1907r1.html的真正意图吗? ?

最佳答案

Is this the real intent of [P1907]?



P1907 的目的是正确指定两个值在模板参数上下文中等效的含义。在本文之前,等价的概念首先基于 <=>。 ( P0732 ) 然后基于 == ( P1185 ),但是使用这些比较运算符作为基础有很多问题(如论文中所述)。

考虑指针。我们已经有很长时间的写作能力:
template <char const*> struct X { };

在这里, X<p>X<q>如果指针 p 是相同的类型和 q指向具有静态存储持续时间的同一个对象或两个空指针(P1907 还允许两者都成为结束指针或都指向同一个子对象)。

现在,考虑如下类型:
struct S {
char const* b;
char const* e;
char const* c;
};

怎么会:
template <S> struct Y { };

工作?这种类型具有所有公共(public)成员,因此可以肯定地说它没有不变量——任何人都可以修改这些指针中的任何一个以指向任何东西。那么规则是 Y<s1>Y<s2>如果 s1.b 是同一类型和 s2.b是相同的指针,如果 s1.es2.e是相同的指针,如果 s1.cs2.c是同一个指针。三对都是一样的。

现在考虑如下类型:
class String {
private:
char const* begin_;
char const* end_;
char const* capacity_;

public:
constexpr String();
constexpr String(char const*);
constexpr String(String const&);
constexpr String& operator=(String const&);
constexpr ~String();
};

这种类型具有私有(private)成员,因此强制执行一些不变量 - 并且可能对“相同”的含义有不同的理解,而不仅仅是“其所有成员成对等效”。确实, String大致是怎样 std::string看起来(忽略 SSO),如果我们采用成员等效的方法,那么我们会遇到给定的情况:
template <String> struct Z { };
Z<"hello"s>每次可能会给出不同的类型 - 因为我们必须分配存储空间来保存字符串,并且那些底层指针可能不同。 P1907 的一个重要驱动因素是最终允许:
template <std::string> struct C;

这样 C<"hello">不仅在翻译单元中始终是同一类型,而且在所有翻译单元中始终是同一类型。以及基于 <=> 的机制/ ==不适用于这种情况。获得 std::string的唯一途径要作为非类型模板参数正常工作,是能够具有自定义机制, std::string 的作者指定等价基于什么——在这种情况下,我们甚至根本不会查看容量指针,它只是基于 begin_ 中的字符序列。至 end_ (不是指针值,指向的值)。

这种新机制还不存在(作者暗示了 operator template ),所以在它存在之前有两种选择:
  • 删除所有类类型作为非类型模板参数
  • 提出一种适用于某些类型的默认机制,但不会向其他类型添加不正确的等效概念,即使这会阻止将某些类类型用作非类型模板参数,从这些参数中的成员等效规则将是正确的.

  • 我们选择了选项 2,使用“所有公共(public)”作为进行简单的、逐个成员等效的机制……理解 C++23 将具有这样的机制(如 operator template )以允许非类型 std::string 等类型的模板参数, std::vector<char> , std::optional<int> , ETC。

    关于c++ - 结构类型为 NTTP : why must all members be public?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59422612/

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