想象以下簡化的代碼:傳遞文字作爲一個const ref參數
#include <iostream>
void foo(const int& x) { do_something_with(x); }
int main() { foo(42); return 0; }
(1)優化之外,當42被傳遞到foo
會發生什麼?
編譯器是否在某個地方(在堆棧上?)將其地址傳遞給foo
?
(1a)標準中是否有任何規定在這種情況下要做什麼(或嚴格遵守編譯器)?
試想一下,略有不同的代碼:(?由於ODR)
#include <iostream>
void foo(const int& x) { do_something_with(x); }
struct bar { static constexpr int baz = 42; };
int main() { foo(bar::baz); return 0; }
它不會鏈接,除非我定義int bar::baz;
。 (2)除了ODR之外,編譯器爲什麼不能像上面的42那樣做它?
把事情簡單化一個顯而易見的方法是定義foo
爲:
void foo(int x) { do_something_with(x); }
然而,你會在一個模板的情況下怎麼辦?例如:
template<typename T>
void foo(T&& x) { do_something_with(std::forward<T>(x)); }
(3)有一種優雅的方式來告訴foo
通過對基本類型值接受x
?還是我需要用SFINAE或其他類似的東西來專門化它?
編輯:修改foo
內發生的事情,因爲它與此問題無關。
可能爲T &&和T生成的代碼與42相同,它只是函數中的寄存器中的值,而不管它如何傳遞到函數? –
如果這個關於編譯器的實現的問題,那真的沒有定義,作爲一個constexpr值,編譯器可能會把'movl'那42個註冊到代碼中。 – Swift