【发布时间】:2011-08-29 14:58:40
【问题描述】:
template <typename TAG>
fn(int left, TAG, int right)
{
}
fn(0, some_type_tag(), 1);
/* or */
fn(0,int(), 1); // where the primitive, int, is not empty.
编辑:这个问题有两种观点。
- 函数声明与定义。声明可能不会命名参数,但声明可能会命名。这不是我们感兴趣的观点。
- 模板视角,特别是在元编程中。有问题的参数是用于从特征中提取元结构的标签。这就是为什么参数没有命名的原因,我只关心编译时的信息——标签的类型。
/编辑
我的标签通常是空结构,但是在我的代码的某些部分,它们是原始类型的 typedef。所以,我很想知道现代编译器是否真的会传递参数。这有两个方面。
- 调整堆栈大小,考虑未命名参数类型的大小。
- 实际上是用传入的值构造堆栈。
让我们继续使用 gcc 4.5 和 msvc 2008+
【问题讨论】:
-
结果会因编译器和优化级别而异。您必须尝试一下。
-
我每天有 10 个这样的问题,如果我对所有事情都进行试验,我将无法完成任何工作 ;),我已经用我感兴趣的两个编译器对问题进行了限定。跨度>
-
@Hassan:我想你会在写一个简单的测试而不是写整个问题之前结束:)
-
寄存器中传入的参数呢?
-
@diego,这可能是真的(但我对此表示怀疑),但即使是这样,当我忘记答案时,我将来也不会有一个很好的参考点。