在示例代碼中,用 C 17 編譯:
template <typename T = int>
struct A
{
static constexpr double b = 0.5;
};
int main()
{
A a; // compiles
double c = A<>::b; // compiles
double d = A::b; // fails to compile
// ...
return 0;
}
活生生的例子
A::b 無法編譯,因為:
main.cpp:13:16: error: 'template<class T> struct A' used without template arguments
13 | double d = A::b; // fails to compile
我認為在 C 17 中自動模板型別推導會解決這個問題,因為我有默認的模板引數。我錯過了什么?
uj5u.com熱心網友回復:
每個實體化的類實體都有自己的A<T>::b成員。
#include <iostream>
template <typename T = int>
struct A
{
static constexpr double b = 0.5;
};
int main()
{
std::cout << &A<int>::b << "\n";
std::cout << &A<char>::b << "\n";
return 0;
}
使用選項 .clang 13 編譯-std=c 17。輸出:
0x402008
0x402018
想想如果A::b可以編譯,編譯器會選擇哪個地址。
現場示例https://godbolt.org/z/GqhjMvoz6
至于double d = A::b;使用默認模板引數編譯失敗,這是規則,模板必須使用尖括號實體化<, >。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/366256.html
