gpt4 book ai didi

c++ - 将 C 数组传递给在类范围内声明的静态函数

转载 作者:行者123 更新时间:2023-12-01 13:46:39 25 4
gpt4 key购买 nike

为什么在下面的示例中,如果在类范围内声明了相同的静态函数,编译器无法绑定(bind)它?

#include <vector>
#include <iostream>

struct Foo
{
static constexpr int GetSize()
{
return 5;
}
static void ProcessArrayWrong(int(&indices)[Foo::GetSize()])
{
for(int i =0; i < Foo::GetSize(); i++)
{
indices[i]++;
}
}
};

static void ProcessArray(int(&indices)[Foo::GetSize()])
{
for(int i =0; i < Foo::GetSize(); i++)
{
indices[i]++;
}
}

int main(int argc, char* argv[])
{
int foo[Foo::GetSize()] = {1,2,3,4,5};

for(int i =0; i < Foo::GetSize(); i++)
{
std::cout << foo[i]++ << std::endl;
}
ProcessArray(foo);
ProcessArrayWrong(foo); // fails here
for(int i =0; i < Foo::GetSize(); i++)
{
std::cout << foo[i]++ << std::endl;
}
return 0;
}

错误是:

error: non-const lvalue reference to type 'int [*]' cannot bind to a value of unrelated type 'int



似乎评论中链接的问题正在解释为什么这是一个错误。谢谢。
关于链接帖子中提供的答案,现在很高兴知道:
  • 为什么“模板技巧”确实有效?我怀疑是因为模板代码需要额外编译一次,但我宁愿对此有更明确的看法。
  • 声明该函数是否有模板导致任何不想要或非预期的行为,或者使用它是否安全?
  • 最佳答案

    “模板技巧”之所以有效,是因为模板(和类模板的成员函数)已经按需实例化。虽然标准实际上并没有说该属性允许成员函数用于诸如数组大小之类的事情,但在非模板情况下也没有任何实际规则反对它,并且常见的实现策略支持该技巧作为附带好处。

    鉴于 current opinion是(类)模板行为更正确,依赖它可能是安全的。而且,标准库把各种各样的东西都声明为模板是不可见的,表明它一般不会造成问题。 (您甚至可以使用诸如显式实例化之类的东西来将函数模板的定义保留在其他地方。)

    关于c++ - 将 C 数组传递给在类范围内声明的静态函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60931133/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com