C++ 是否有可能区分'const'变量与非'const'变量以及'const&;'推荐人?

C++ 是否有可能区分'const'变量与非'const'变量以及'const&;'推荐人?,c++,reference,constants,immutability,sfinae,C++,Reference,Constants,Immutability,Sfinae,假设我想创建我自己的引用(“智能指针”)类型,它保证总是引用不可变的数据,而不仅仅是不可变的查看数据。换句话说,数据不能被任何人改变,而不是仅仅通过那个特定的引用。这并不是那么容易,因为C++一般认为 const 是可访问的事物的一个子实例,并且和引用隐式转换为 const和,同样地,代码> */> >到 const */COD> 我们称之为这种类型: template<typename T> class ImmRef { ... }; 但这不应: int myNumber = 6

假设我想创建我自己的引用(“智能指针”)类型,它保证总是引用不可变的数据,而不仅仅是不可变的查看数据。换句话说,数据不能被任何人改变,而不是仅仅通过那个特定的引用。这并不是那么容易,因为C++一般认为 const 是可访问的事物的一个子实例,并且<代码>和<代码>引用隐式转换为<代码> const和,同样地,代码> */> >到<代码> const */COD> 我们称之为这种类型:

template<typename T>
class ImmRef { ... };
但这不应:

int myNumber = 666;
ImmRef<int> myImmRef = immRef(myNumber);
const int& myConstRef = myNumber;
ImmRef<int> myImmRef = immRef(myConstRef);
int myNumber=666;
ImmRef myImmRef=ImmRef(myNumber);
这不应:

int myNumber = 666;
ImmRef<int> myImmRef = immRef(myNumber);
const int& myConstRef = myNumber;
ImmRef<int> myImmRef = immRef(myConstRef);
const int&myConstRef=myNumber;
ImmRef myImmRef=ImmRef(myConstRef);

有什么黑暗的模板魔法可以让我这么做吗?

无法判断引用引用引用的是真实的
常量。函数无法判断其参数是命名对象还是引用

decltype
将明确告诉您名称属于
const
对象(不是引用),但名称必须在范围内。此用法不能封装在模板中

如果您真的需要,宏可以完成此任务:

#define MAKE_IMMREF( NAME ) ImmRef< decltype( NAME ) >{ NAME }

template<typename T>
struct ImmRef {
    static_assert ( std::is_const< T >::value, "ImmRef requires a constant." );

    T & ref;
};
#定义MAKE_IMMREF(NAME)IMMREF{NAME}
模板
结构ImmRef{
静态断言(std::is_const::值,“ImmRef需要一个常量”);
T&ref;
};

不,没有。顺便说一句:这可能很有趣,但有一点:如果您给系统的值是
template const T&f(const T&x){return x;}
,那么它总是会被愚弄。您通常无法区分id表达式的值和其他值。您可以区分前两个值,但第一个值和第三个值是无法区分的。@KerrekSB我唯一能想到的是一个带有
decltype
@t.C.macro plus
decltype
的宏。实际上,这似乎是一个合理的解决方案(不是气密的,但是C++中没有),谢谢。如果你把它提交给我,我会接受的,如果你想要点。