![](/img/trans.png)
[英]Auto non-type template parameter: ambiguous partial specializations in Clang
[英]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<&S::x>
和T
T<&S::y>
是否保證引用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模板特化可以通過template-id來引用:[...]
模板專業化由template-id正式引用,並且根據[temp.type]/1 ,它控制類型等價,特別是[temp.type]/1.5 [強調我的]
[temp.type]/1兩個template-id引用同一個 class , function 或變量if
- /1.1它們的template-names 、 operator-function-ids或literal-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.