3
は私のクラスの定義であり、そのための機能を作る:私はint型左辺値make_a
に関数を渡すとき汎用参照から型を推測する際にconstが無視されるのはなぜですか?ここ
template< typename T >
class A
{
public:
A(T test)
: _test(test)
{}
public:
const T _test;
};
template <typename T>
A<T> make_a (T&& elem) {
return A<T>{std::forward<T>(elem)};
}
、私はインスタンス化されたクラスは
class B
{
public:
B(int &test)
: _test(test)
{}
public:
const int &_test;
};
に類似であることを期待しかし、 A::_test
のタイプはint&
の代わりconst int&
なると推定されています
int main(int argc, const char * argv[]) {
int a = 1;
auto aa = make_a(a);
aa._test = 2; // compiled OK
B bb(a);
bb._test = 2; // compilation error
return 0;
}
誰もこのような行動の原因を教えてもらえますか?
私はXCode 7.0、LLVM 7.0のデフォルトコンパイラを使用しています。
ありがとうございました。
ため 'のconst add_lvalue_reference_t' INT&あります。 –
'const int&'では、 'int'はconstであり、参照ではありません。これは 'const int'への参照であり、' 'int''へのconst参照ではありません。しかし 'cons T'では' T'の 'const'であり、' T'のサブタイプではありません。 'T 'が参照型であるとき、' const T'は 'const参照'を意味しますが、それはノーオペレーションです。参照は、ある意味では常に 'const'です(初期化されると、参照する内容を変更することはできません)。 –
'T'が' int * 'だった場合、' const T'は 'int * const'(非const' int'へのconstポインタ)になります。これはまったく同じではありません'const int *'別名int const * '(const' int'への非constポインタ)。 –