2012-05-16 5 views
6

かしら:アレイと右辺値

#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では可能ですか? そうでない場合は、可能でしょうか? (明らかに標準を変更する)

よろしく。 フェルナンド。

+0

::配列<>'代わりに、生のC-アレイで、これは些細なことになります。

配列右辺値は、このようなものになるだろう。 – ildjarn

答えて

14

foo_arrayに間違いがありません。それは悪いテストケースです:"hello"は左辺です!それについて考える。これは一時的ではありません。文字列リテラルは静的な記憶期間を持ちます。あなたは `のstdを使用した場合

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

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

これは、ideone上の同様の例です(GCC 4.5の制限付きC++ 11サポートに合わせて格下げされています):http://ideone.com/lgItR –

+2

とてもいいです。テンポラリ配列をポインタに壊すことはできますか?私。実際に住所を持っているのですか? –

+0

@KerrekSB興味深い質問私は答えがわからない(と私は今多くの研究のための時間がない)と恐れている。それについて新しい質問を投稿する価値があります。 –

関連する問題