我沿着線的東西:模板轉換操作符的優先級和常量性
#include <iostream>
class Foo;
struct Test
{
template <typename T>
operator T() const // <----- This const is what puzzles me
{
std::cout << "Template conversion" << std::endl;
return T{};
}
operator Foo*()
{
std::cout << "Pointer conversion" << std::endl;
return nullptr;
}
};
int main()
{
Test t;
if (t)
{
std::cout << "ahoy" << std::endl;
}
bool b = (bool)t;
Foo* f = (Foo*)t;
}
它建立正常,但是當我運行它,而我希望得到
$> ./a.out
Template conversion
Template conversion
Pointer conversion
我反而得到
$> ./a.out
Pointer conversion
Pointer conversion
Pointer conversion
如果我刪除了常量,或使測試實例常量,則一切正常。 更準確地說,當兩個操作符具有相同的常量限定時,重載選擇似乎是有意義的。
13.3.3.1.2點的標準讓我覺得我應該得到一個身份轉換,轉換成一個布爾值,使用模板變換操作實例化一個T
= bool
,但顯然是有一個精妙藏在什麼地方。有人能告訴我這裏有什麼規則?
運算符Foo *具有比模板運算符更高的優先級,並且Foo *可以隱式轉換爲bool,所以編譯器會選擇Foo *重載而不是模板。 – Creris
創建身份轉換的潛在實例是否應該具有更高的優先級? 似乎常量大多是什麼使得選擇正確的轉換 – chouquette
顯然不是如果它是模板 – Creris