想象以下简化的代码:传递文字作为一个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