瀉藥。
首先,題主給的例子貌似很正常啊,標頭檔案用引號是先在當前目錄中搜尋有沒有這個標頭檔案,如果沒有,再去類庫找。而尖括號是直接去類庫找。所以邏輯上確實沒問題。
如果說到反常規,學過編譯原理的人可能知道下面這個好玩的東西。
int a[3] = {1, 2, 3};
std::cout << 1[a] ; //輸出的是a[1]
std::cout << 2[a] ; //輸出的是a[2]
貌似就是運用到了 *(a+1) 等價於 *(1+a) 這個神奇的加法交換律,不過只能用在基本資料型別上,類的話即使過載運算子也沒有這個現象。(逃
C++中內建型別也是可以用
()
或者
{}
初始化的,比如說:
int
a
(
0
);
int
b
{
0
};
int
c
=
0
;
// 可能大多數人(尤其是從C轉C++的)就知道了用等號初始化
特別地:
int a(); // 這是個函式宣告
int b{}; // 這是初始化了一個int型別物件b
上面提到了內建型別的初始化,再來提一下內建型別的“析構”。。。沒錯,解構函式呼叫語法可作用於非類型別物件,這也被稱為
pseudo-destructor call
。主要是為了在寫模板的時候免除一些特化。
using T = int;
int i{};
i。~T(); // 這裡並非真正的“析構”
奇葩的
std::vector
,它是按位儲存
bool
的,
operator[]
返回的不是
bool&
而是
std::vector
作為代理類。
std::vector
bool *bp = &bools[0]; // 編譯出錯
還有就是pointer to member 和普通的pointer不一樣。。。
0xA+1
是合法的,
0xE+1
是不合法的。
class A {}; class B : A {}; class C : B { A* pa; };
是不合法的,正確做法是把
A* pa;
改成
::A* pa;
。
long long
是 C++11 才有的型別。
T &&
(以及對應的
auto &&
)在進行模板引數推導(template argument deduction)時:
如果是在過載決議(overload resolution)中匹配一個函式模板,作為該函式模板的引數型別,那麼會被看成是universal reference。
如果出現在其它地方,即使也是作為一個模板函式型別的引數型別,那仍然會被看成是rvalue reference。
所以這就導致瞭如下看上去反常的結果出現:
[Wandbox]三へ( へ՞ਊ ՞)へ ハッハッ