Сьогодні я натрапив на цікаве питання. Розглянемо цей простий приклад:
template <typename T>
void foo(const T & a) { /* code */ }
// This would also fail
// void foo(const int & a) { /* code */ }
class Bar
{
public:
static const int kConst = 1;
void func()
{
foo(kConst); // This is the important line
}
};
int main()
{
Bar b;
b.func();
}
При компіляції я отримую помилку:
Undefined reference to 'Bar::kConst'
Зараз я майже впевнений, що це тому, що static const int
значення ніде не визначено, що є навмисним, оскільки, на моє розуміння, компілятор повинен мати змогу зробити заміну під час компіляції і не потребувати визначення. Однак, оскільки функція приймає const int &
параметр, здається, вона не робить заміну, а віддає перевагу посиланню. Я можу вирішити цю проблему, внісши такі зміни:
foo(static_cast<int>(kConst));
Я вважаю, що це зараз змушує компілятор зробити тимчасовий int, а потім передати посилання на це, що він може успішно зробити під час компіляції.
Мені було цікаво, чи це було навмисно, чи я очікую занадто багато від gcc, щоб мати змогу розглянути цю справу? Або це те, чого я не повинен робити з якихось причин?
const int kConst = 1;
той самий результат. Крім того, рідко буває причина (я не можу придумати жодної), щоб функція приймала параметр типуconst int &
- просто використовуйтеint
тут.