2016-10-21 10 views
8
#include <iostream> 
#include <string> 

void foo(int& k) { std::cout << "int&\n"; } 
void foo(int&& k) { std::cout << "int&&\n"; } 
void foo(const int& k) { std::cout << "const int&\n"; } 
void foo(const int&& k) { std::cout << "const int&&\n"; }  
int main() { 
    static constexpr int k = 1; 
    foo(k); 
    foo(1); 
} 

出力は、次のとおりです。まったく同じように扱わconstexprの変数です推測されるconstexprのタイプは何ですか?

const int& 
int&& 

何? fooの過負荷はconst int&となります。

編集:constexprで移動すると、const T&と推測されます。

なぜクラススコープのconstexprが汎用参照を受け付ける関数に渡されないのですか?

#include <type_traits> 

template <typename T> 
void goo(T&& k) { 
    static_assert(std::is_same<decltype(k), const int&>::value, "k is const int&"); 
} 

class F { 
    static constexpr int k = 1; 
public: 
    void kk2() { goo(k); } 
}; 

int main() { 
    F a; 
    a.kk2(); 
} 

は上記の下方を通過しかしエラーundefined reference to F::k を与えるコンパイルに失敗:オブジェクトの宣言で使用

#include <type_traits> 

template <typename T> 
void goo(T&& k) { 
    static_assert(std::is_same<decltype(k), const int&>::value, "k is const int&"); 
} 

int main() { 
    static constexpr int k = 1; 
    goo(k); 
} 
+0

@GuillaumeRacicot文章は 'goo(T && k)'を参照していると思います。 – Oktalist

答えて

1
foo(1); 

1と一時変数は、関数foo、したがって非const右辺値に渡されます。ここで

/*static*/ constexpr int k = 1; 
foo(k); 

1名前付きのconst変数が故に機能foo、constの左辺値に渡されます。 staticキーワードは、関数スコープの変数constexprには影響しません。

正確にconstexpr変数はどのように扱われますか?

定数式ではない式で使用すると、変数は変数constになります。

なぜクラススコープのconstexprが汎用参照を受け取る関数に渡されないのですか?

変数を定義せずに変数をodr-usedしたため、リンカーエラーが表示されます。 C++ 98のstatic constメンバ変数と同じように、名前空間のスコープには、正確に1つの翻訳単位でF::kの定義が必要です。

2

N3337 [dcl.constexpr]/9:constexpr指定子はconstとしてオブジェクトを宣言する。あなたはconstexprとしてkを宣言しているので、[...]

を、それはまた、constとして宣言されているので、const int&は、オーバーロードの解決に選択されています。この場合

関連する問題