簡體   English   中英

具有不同指向成員的參數的非類型模板參數的特化是否保證是唯一的特化?

[英]Are specializations over a non-type template parameter with an argument of different pointer-to-members guaranteed to be unique specializations?

考慮以下 class 模板:

template <auto>
struct T {};
  • T的兩個特化,其中各自的模板參數是指向兩個不同但相同類型成員的成員指針(1) ,是否保證引用T的不同特化?

(1)指向數據成員的指針或指向成員function的指針。


或者,應用於以下示例:

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 T<&S::y>是否保證引用T的不同特化?
  • T 的特化T<&S::f>T 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


是的,他們保證指的是不同的專業。

根據[temp.names]/1

[temp.names]/1模板特化可以通過template-id來引用:[...]

模板專業化由template-id正式引用,並且根據[temp.type]/1 ,它控制類型等價,特別是[temp.type]/1.5 [強調我的]

[temp.type]/1兩個template-id引用同一個 class , function 或變量if

  • /1.1它們的template-namesoperator-function-idsliteral-operator-ids指的是同一個模板,並且
  • [...]
  • /1.5它們對應的指向成員類型的非類型模板參數指的是相同的 class 成員,或者都是 null 成員指針值和 [...]

如果指針成員類型的非類型模板參數引用同一 class (模板)的不同class 成員,則不適用於模板 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 將T<&A::foo>T<&A::bar>視為相同的類型。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM