次の単純化されたコードを想像してください。
#include <iostream>
void foo(const int& x) { do_something_with(x); }
int main() { foo(42); return 0; }
(1) 最適化はさておき、42 が に渡されるとどうなりfoo
ますか?
コンパイラは 42 をどこかに (スタック上の?) 貼り付けて、そのアドレスを に渡しますfoo
か?
(1a) この状況で何をすべきかを指示する標準に何かありますか (または厳密にはコンパイラ次第ですか)?
ここで、少し異なるコードを想像してください。
#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;
(ODRのため?)。
(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
:この質問とは無関係であるため、内部で何が起こるかを変更しました。