【问题标题】:How do you force compiler to pass some variable by reference in C++?你如何强制编译器在 C++ 中通过引用传递一些变量?
【发布时间】:2011-07-23 13:53:40
【问题描述】:

这是一个简单的例子;

template <typename T>
void foo(T t) {}

std::string str("some huge text");
foo(str);

我的问题是如何强制编译器通过引用传递 str 不修改函数 foo?

【问题讨论】:

  • 如果foo 没有被编码来处理引用,你为什么要这样做?
  • @Mat:严格来说,它的编码既不是处理引用也不是非引用。其唯一参数的类型取决于模板参数。 (当然,如果打算以这种方式使用,您通常会在函数模板参数列表中看到 T&amp; t。)

标签: c++ pass-by-reference


【解决方案1】:

显式传递引用类型:

template <typename T>
void foo(T t) {}

int main() {
   std::string str("some huge text");
   foo<std::string&>(str);
}

确实修改了您获得的函数实例化(通过生成void foo&lt;std::string&amp;&gt;(std::string&amp; t)),但它不会修改函数模板。

Live demo.

【讨论】:

  • 非常感谢。这就是我一直在寻找的答案。
【解决方案2】:

您可以绕过模板参数推导并显式传递std::string&amp;

【讨论】:

【解决方案3】:

除了其他答案,你还可以考虑重载foo()

template <typename T>
void foo(T t) {}

void foo(std::string &t) {}

std::string str("some huge text");
foo(str);

这样您就不会改变实际的foo() 行为并使用重载版本完成工作。

【讨论】:

  • 是否有规则指定编译器使用foo()的参考版本?我有点认为编译器仍然会使用 foo() 的值传递版本。
  • @SamuelLi,编译器首先选择最匹配的重载版本。默认情况下,参数通过引用或 const 引用或值传递。由于我们通过引用接收参数,因此它将被选中。如果没有其他内容,则选择模板案例。延伸到这个讨论,如果将std::string 派生为MyString 然后传递它,那么即使它是匹配的基数,也不会选择foo(std::string&amp;)。但它宁愿选择模板。
  • 哦,我明白你的意思了,谢谢你的解释。我在想你显式实例化foo(T t) 的一个版本的情况,模板类型是引用类型,类似于template void foo( std::string&amp; );。好像不会调用这个版本...
  • 我特别想知道为什么this 代码无法编译...
【解决方案4】:

boost::reference_wrapper 也应该可以解决您的问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-04-19
    • 2020-11-08
    • 2010-11-02
    相关资源
    最近更新 更多