对具有指向成员的不同指针的参数的非类型模板参数的专门化是否保证是唯一的专门化



考虑以下类模板:

template <auto>
struct T {};
  • 是否是T的两个专门化,其中相应的模板参数是指向两个不同但类型相同的成员的成员(1(的指针,保证引用T的不同专门化

(1(指向数据成员的指针或指向成员函数的指针


或者,应用于以下示例:

struct S {
int x;
int y;
void f();
void g();
};
static_assert(std::is_same_v<decltype(&S::x), decltype(&S::y)>);
static_assert(std::is_same_v<decltype(&S::f), decltype(&S::g)>);
  • T的专业T<&S::x>T<&S::y>是否保证引用T的不同专业
  • T的专业T<&S::f>T<&S::g>是否保证引用T的不同专业

或者,在代码中,以下代码段的格式是否正确?

// T and S as above.
static_assert(!std::is_same_v<T<&S::x>, T<&S::y>>);
static_assert(!std::is_same_v<T<&S::f>, T<&S::g>>);

以下所有标准参考文献均参考N4659:2017年3月Kona工作草案/C++17 DIS


是的,它们保证指代不同的专业。

根据【临时名称】/1

[temp.names]/1模板专用化可以由模板id引用:[…]

模板专用化由模板id正式引用,并根据控制类型等价性的[temp.type]/1,特别是[temp.ttype]/1.5[emphasismine]

[temp.type]/1 两个模板id引用相同的类、函数或变量如果

  • /1.1它们的模板名称运算符函数ids文字运算符ids引用相同的模板,并且
  • […]
  • /1.5 它们对应的指向成员类型的指针的非类型模板参数引用相同的类成员或同时是null成员指针值和[…]

如果其指向成员类型的指针的非类型模板参数引用了同一类(模板(的不同类成员,则不适用模版id

以为例

static_assert(!std::is_same_v<T<&S::x>, T<&S::y>>);
static_assert(!std::is_same_v<T<&S::f>, T<&S::g>>);

特别是,[temp.type]/1.1适用并已满足,而/1.5适用但未满足([temp.type]/1的其余段落在此不适用(。

理论上是的。实际上,考虑

union A {
int foo;
int bar;
};
template<auto>
struct T{};

MSVC将CCD_ 11和CCD_。

最新更新