在什么情况下会调用类型的转换运算符?
Under what circumstances would a type's conversion operator to itself be invoked?
考虑一个类型bar
,它具有用户定义的到bar
类型引用的转换操作符:
struct bar
{
operator bar & ();
operator const bar & () const;
};
何时应用这些转换?此外,如果这些算子是deleted
又意味着什么呢?这两个特性有什么有趣的用途吗?
下面的程序似乎没有应用这两种转换:
#include <iostream>
struct bar
{
operator bar & ()
{
std::cout << "operator bar &()" << std::endl;
return *this;
}
operator const bar & () const
{
std::cout << "operator const bar &() const" << std::endl;
return *this;
}
};
void foo(bar x)
{
}
int main()
{
bar x;
bar y = x; // copy, no conversion
y = x; // assignment, no conversion
foo(x); // copy, no conversion
y = (bar&)x; // no output
y = (const bar&)x; // no output
return 0;
}
c++ 11§12.3.2
转换函数永远不能用于将(可能限定为cv的)对象转换为(可能限定为cv的)相同对象类型(或对其的引用),转换为该类型的(可能限定为cv的)基类(或对其的引用),或转换为(可能限定为cv的)void
允许定义从类型到自身的转换函数,但从不使用转换函数的特性在模板编程中可能是一个有用的特性,其中两个类型参数可能引用或不引用相同的类型,这取决于实例化。我的一些代码依赖于这个特性。当两个或多个类型参数最终引用同一类型时,可以避免提供特殊化。
我不明白为什么要调用它。转换函数被调用到…转换。如果已经有了正确的类型,则绝对没有理由在复制之前添加转换操作。
提醒一下。我设法在一个更大的软件项目中创建了这种结构,盲目地相信编译器的警告并删除了"从未使用过的方法"。好吧,我想我找到了一个场景,它实际上被称为。编译器似乎忽略了基类。
#include <iostream>
struct D;
struct B
{
virtual operator D& ()
{
throw "foo";
}
};
struct D : public B
{
virtual operator D& ()
{
std::cout << "bar" << std::endl;
return *this;
}
};
int main()
{
B* b = new D();
D& d = *b;
return 0;
}
相关文章:
- 有没有一种方法可以通过"typedef"为重新定义的基本类型定义特征和强制转换运算符
- 构造函数和转换运算符之间的重载解析
- 分配给转换运算符失败-C++
- 转换运算符不适用于sleep_until
- 继承模板化转换运算符
- 模板转换运算符在 clang 6 和 clang 7 之间的区别
- 如何在模板化转换运算符中消除此构造的歧义?
- 为什么选择转换运算符的重载?
- 如何避免强制转换运算符 () 和访问运算符 [] 冲突?
- 如果可能的话,C++总是更喜欢右值引用转换运算符而不是常量左值引用吗?
- 了解转换运算符的选择C++
- 多个隐式转换运算符
- 这个typedef和转换运算符语法是什么意思
- 为什么转换运算符调用复制构造函数两次,而等效函数只调用它一次
- 类模板忽略了用户定义的转换运算符(非模板不忽略)
- 为什么在std::for_each()返回时调用转换运算符
- 为什么 std::optional 的强制转换运算符被忽略了
- 使用用户定义的转换运算符推导函数模板参数
- 模板转换运算符的分辨率不明确
- 统一初始化是隐式发生的,即使 int 强制转换运算符是使用 explicit 关键字声明的.原因是什么?