#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);
}
@GuillaumeRacicot文章は 'goo(T && k)'を参照していると思います。 – Oktalist