gpt4 book ai didi

c++ - 模板类中引用的类型检查不那么严格吗?

转载 作者:行者123 更新时间:2023-11-28 08:14:09 25 4
gpt4 key购买 nike

C++ 通过提升允许以下内容:

int ivalue = true;
bool bvalue = 1;

没关系。这是不允许的,通过类型检查:

int& ivalue = false;
bool& bvalue = 0;

没关系。

看看这个,来自维基百科。 http://en.wikipedia.org/wiki/Property_(programming)#C.2B.2B

#include <iostream>

template <typename T> class property {
T value;
public:
T & operator = (const T &i) {
::std::cout << "T1: " << i << ::std::endl;
return value = i;
}
// This template class member function template serves the purpose to make
// typing more strict. Assignment to this is only possible with exact identical
// types.
template <typename T2> T2 operator = (const T2 &i) {
::std::cout << "T2: " << i << ::std::endl;
T2 &guard = value;
return value = i;
throw guard; // Never reached.
}/**/
operator T const & () const {
return value;
}
};

struct Bar {
// Using the property<>-template.
property <bool> alpha;
property <unsigned int> bravo;
};

int main () {
Bar bar;
bar.alpha = true;
bar.bravo = true; // This line will yield a compile time error
// due to the guard template member function.
::std::cout << foo.alpha << ", "
<< foo.bravo << ", "
<< bar.alpha << ", "
<< bar.bravo
<< ::std::endl;


bool bvar = 22;
int ivar = true;
//int &newvar = bvar;

print(bvar);

::std::cout << bvar << " and " << ivar << "\n";
return 0;
}

我认为使用模板时引用的类型检查会丢失吗?我说得对吗?

最佳答案

不,无论是否涉及模板,类型转换和引用绑定(bind)规则都是相同的。您可以将一个临时的(例如当 referee 与引用类型不同时您需要的那个)绑定(bind)到 const 引用,但不能绑定(bind)到非 const 引用.

这就是为什么您的第二对示例无法编译的原因,也是为什么当参数类型与模板参数不匹配时模板 operator= 在更大的示例中无法编译的原因。在这两种情况下,代码都会尝试通过类型转换创建临时对象并将其绑定(bind)到非 const 引用。

关于c++ - 模板类中引用的类型检查不那么严格吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8186785/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com