C 三元操作员的转换理解
c++ ternary operator conversion understanding
我无法理解该三元运算符的转换逻辑(这是一个示例):
#include <iostream>
#include <typeinfo>
#include <unistd.h>
#include <cxxabi.h>
#include <climits>
template<typename T>
struct singletime
{
private:
T value;
public:
T& operator()() {return this->value;}
operator const T& () const {return value;}
unsigned char flag_needed_for_all_types;
};
static void getvalue1 (uint64_t value, const char *call)
{
std::cout << call << ": t" << value << std::endl << std::endl;
}
#define getvalue(x, str)
std::cout << typeid(x).name() << std::endl;
getvalue1(x, str);
int main (int argc, char *argv[])
{
bool flag = true;
singletime<uint64_t> singletime_64;
singletime_64() = INT_MAX+1lu;
uint64_t value_64 = singletime_64;
getvalue (flag ? singletime_64 : 0, "Ternary with singletime, > INT_MAX");
getvalue (singletime_64, "singletime w/o ternary, > INT_MAX");
getvalue (flag ? value_64 : 0, "Ternary with uint64_t, > INT_MAX");
getvalue (value_64, "uint64_t w/o ternary, > INT_MAX");
singletime_64() = INT_MAX;
uint64_t value_64_l = singletime_64;
getvalue (flag ? singletime_64 : 0, "Ternary with singletime, <= INT_MAX");
getvalue (singletime_64, "singletime w/o ternary, <= INT_MAX");
getvalue (flag ? value_64_l : 0, "Ternary with uint64_t, <= INT_MAX");
getvalue (value_64_l, "uint64_t w/o ternary, <= INT_MAX");
return 0;
}
我有一个模板类singletime<T>
,它是任何类型的包装器,用于案例,与此问题无关,并且转换运算符到T
。问题是当singletime<uint64_t>
在三元运算符表达式中使用时。
这是有问题的行:
getvalue (flag ? singletime_64 : 0, "Ternary with singletime, > INT_MAX");
64位值转换为int,如果值高于 INT_MAX
,则会变得不正确。
该示例打印了三元运算符的一些用法类型 - 表达式和结果值的结果类型。
这是示例的输出:
int
Ternary with singletime, > INT_MAX: 18446744071562067968
singletime<unsigned long>
singletime w/o ternary, > INT_MAX: 2147483648
unsigned long
Ternary with uint64_t, > INT_MAX: 2147483648
unsigned long
uint64_t w/o ternary, > INT_MAX: 2147483648
int
Ternary with singletime, <= INT_MAX: 2147483647
singletime<unsigned long>
singletime w/o ternary, <= INT_MAX: 2147483647
unsigned long
Ternary with uint64_t, <= INT_MAX: 2147483647
unsigned long
uint64_t w/o ternary, <= INT_MAX: 2147483647
唯一的问题是何时将三元运算符与singletime<uint64_t>
一起使用 - 它获取值1844444444071562067968
据我了解,它试图将不同类型的类型转换为一种类型。
由于singletime<uint64_t>
到uint64_t
的转换操作员可能会使用它,但是在那之后,我不明白为什么它将两个值转换为int而不是uint64_t
?在使用uint64_t
代替singletime<uint64_t>
的示例中,INT转换为uint64_t
,并且没有丢失的值
在singletime<uint64_t>
和INT的情况下,也没有关于铸件的编译器警告,较小的类型和潜在的数据丢失。
使用GCC 4.8.2和GCC 5.2.0
来自标准,5.16。
如果第二和第三操作数具有不同的类型,则 (可能是CV合格的)类类型,试图转换每个 这些操作数是另一个类型的操作数。确定T1型操作数表达E1是否可以转换为 匹配T2型的操作数表达式E2定义如下:
如果E2是rvalue,或者无法完成上述转换:
否则(即,如果E1或E2具有非类型,或者它们都有 课程类型,但基础课程不是相同的或一个 另一个):如果E1可以,则可以将E1转换为匹配E2 被隐式转换为表达式E2所具有的类型 将E2转换为rvalue(或它具有的类型,如果E2是 rvalue)。
如果第二和第三操作数没有相同的类型,则 具有(可能是CV合格的)类类型,超载分辨率用于 确定要应用于操作数的转换(如果有) (13.3.1.2,13.6)。
所以,在这里,0是rvalue,它具有int
类型。编译器将尝试将第一个参数转换为int
,这将是由于您的转换操作员而可以完成的。
- 防止主数据类型C++的隐式转换
- 模板参数替换失败,并且未完成隐式转换
- 努力将整数转换为链表。不知道我在这里做错了什么
- HEX值到wchar_t字符(UTF-8)的转换
- 尝试制作类型转换操作员
- 使用用户定义的转换操作员隐式转换
- 是否可以使用明确的模板参数调用模板的用户定义转换操作员
- 为什么返回Sfinae转换操作员不起作用
- C 如何将对象数据传递到用户定义的转换操作员中
- 为什么C 标准要求编译器忽略对基本类型转换操作员的呼叫
- C 三元操作员的转换理解
- C 操作员在具有构造函数转换时过载
- 使用位操作员将十进制转换为八十位
- 转换操作员 转换构造函数=不直觉的行为
- 调用转换操作员
- 模板参数类型通过转换操作员扣除
- STD ::向量有转换操作员吗?我看到了什么
- 将操作员==在C 中转换为Objective-C
- 操作员重载内部调用转换
- std::使用虚拟呼叫操作员转换抛出"global functions do not have 'this' pointers"