【问题标题】:Arrays and Rvalues (as parameters)数组和右值(作为参数)
【发布时间】:2012-05-24 09:00:51
【问题描述】:

不知道有没有什么方法可以区分如下代码所示的函数调用(以数组为参数):

#include <cstring>
#include <iostream>

template <size_t Size>
void foo_array( const char (&data)[Size] )
{
    std::cout << "named\n";
}

template <size_t Size>
void foo_array( char (&&data)[Size] )  //rvalue of arrays?
{
    std::cout << "temporary\n";
}


struct A {};

void foo( const A& a )
{
    std::cout << "named\n";
}

void foo( A&& a )
{
    std::cout << "temporary\n";
}


int main( /* int argc, char* argv[] */ )
{
    A a;
    const A a2;

    foo(a);
    foo(A());               //Temporary -> OK!
    foo(a2);

    //------------------------------------------------------------

    char arr[] = "hello";
    const char arr2[] = "hello";

    foo_array(arr);
    foo_array("hello");     //How I can differentiate this?
    foo_array(arr2);

    return 0;
}

foo“函数族”能够区分临时对象和命名对象。不是 foo_array 的情况。

在 C++11 中可以吗? 如果没有,你认为可能吗? (显然改变了标准)

问候。 费尔南多。

【问题讨论】:

  • 如果您使用 std::array&lt;&gt; 而不是原始 C 数组,这将是微不足道的。

标签: c++ arrays c++11 rvalue-reference rvalue


【解决方案1】:

foo_array 没有任何问题。不好的是测试用例:"hello" 是一个左值!想想看。它不是临时的:字符串文字具有静态存储持续时间。

数组右值是这样的:

template <typename T>
using alias = T;
// you need this thing because char[23]{} is not valid...

foo_array(alias<char[23]> {});

【讨论】:

  • 这里有一个类似的例子(降级以适应 GCC 4.5 有限的 C++11 支持):ideone.com/lgItR
  • 非常好。临时数组可以衰减为指针吗? IE。它实际上有地址吗?
  • @KerrekSB 有趣的问题,恐怕我不知道答案(而且我现在没有时间进行大量研究)。可能值得发布一个关于它的新问题。
  • @R.MartinhoFernandes 谢谢!你说的对。我很困惑。这个问题毫无意义。好技巧!
  • @KerrekSB 是的,它会衰减。但是地址是第一个元素的地址,而不是临时元素本身的地址。已经可以以其他方式访问临时对象的子对象(例如foo {}.bar -- 请注意,您不能使用 那个 地址,这是一个纯右值)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-24
  • 1970-01-01
  • 2020-09-04
  • 2013-07-12
相关资源
最近更新 更多