C++ 有哪些反常規知識點?知乎使用者2018-08-01 11:19:41

瀉藥。

首先,題主給的例子貌似很正常啊,標頭檔案用引號是先在當前目錄中搜尋有沒有這個標頭檔案,如果沒有,再去類庫找。而尖括號是直接去類庫找。所以邏輯上確實沒問題。

如果說到反常規,學過編譯原理的人可能知道下面這個好玩的東西。

int a[3] = {1, 2, 3};

std::cout << 1[a] ; //輸出的是a[1]

std::cout << 2[a] ; //輸出的是a[2]

貌似就是運用到了 *(a+1) 等價於 *(1+a) 這個神奇的加法交換律,不過只能用在基本資料型別上,類的話即使過載運算子也沒有這個現象。(逃

C++ 有哪些反常規知識點?土地測量員2018-08-01 16:04:54

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::reference

作為代理類。

std::vector bools(8);

bool *bp = &bools[0]; // 編譯出錯

還有就是pointer to member 和普通的pointer不一樣。。。

C++ 有哪些反常規知識點?d41d8c2018-09-10 23:05:18

0xA+1

是合法的,

0xE+1

是不合法的。

class A {}; class B : A {}; class C : B { A* pa; };

是不合法的,正確做法是把

A* pa;

改成

::A* pa;

C++ 有哪些反常規知識點?匿名使用者2018-09-10 23:16:07

long long

是 C++11 才有的型別。

C++ 有哪些反常規知識點?匿名使用者2018-10-26 11:23:01

T &&

(以及對應的

auto &&

)在進行模板引數推導(template argument deduction)時:

如果是在過載決議(overload resolution)中匹配一個函式模板,作為該函式模板的引數型別,那麼會被看成是universal reference。

如果出現在其它地方,即使也是作為一個模板函式型別的引數型別,那仍然會被看成是rvalue reference。

所以這就導致瞭如下看上去反常的結果出現:

[Wandbox]三へ( へ՞ਊ ՞)へ ハッハッ