为什么 xlc++ 编译器会抱怨强制转换右值?
Why does the xlc++ compiler complain about casting an rvalue?
在 z/OS 上,pthread_t
类型是一个包含成员 char __[8];
的结构。我试图将其从 return 值转换为 int64_t
。我收到以下错误:
CCN5216 (S) An expression of type "char [8]" cannot be converted to type "int64_t"
但是如果我使用临时变量 tmp
它就可以了。我可以使用 Visual Studio 2015(定义类似于 zos pthread_t
的自定义 mypthread
结构)编译此代码而不会出错。你知道为什么 xlc++ 这个转换有问题吗?演员标准是否符合?
#define _OPEN_THREADS
#include <iostream>
#include <stdint.h>
#include <pthread.h>
pthread_t apr_os_thread_current() {
return pthread_t();
}
int64_t getId() {
pthread_t tmp = apr_os_thread_current();
return (int64_t) tmp.__; // ok
//return (int64_t) apr_os_thread_current().__; // CCN5216
//return reinterpret_cast<int64_t>(apr_os_thread_current().__); // CCN5216
}
int main() {
std::cout << getId() << std::endl;
return 0;
}
没有临时变量,数组是右值的一部分,这可能会抑制隐式 array-to-pointer 转换,要求 char[8]
直接重新解释为 int64_t
。
引入临时变量(左值)启用 tmp.__
上的 array-to-pointer 转换,然后将指针强制转换为 int64_t
而没有任何 "problem",实际上返回一个虚假价值。换句话说,您的 working/compiling 代码等同于以下内容:
return (int64_t) &tmp.__[0]; // ok ???
这只是一个假设,您可以按如下方式检查:
int64_t getId() {
pthread_t tmp = apr_os_thread_current();
int64_t result = (int64_t) tmp.__;
if ( result == (int64_t) &tmp.__[0] )
std::cerr << "oops!" << std::endl;
return result;
}
在 z/OS 上,pthread_t
类型是一个包含成员 char __[8];
的结构。我试图将其从 return 值转换为 int64_t
。我收到以下错误:
CCN5216 (S) An expression of type "char [8]" cannot be converted to type "int64_t"
但是如果我使用临时变量 tmp
它就可以了。我可以使用 Visual Studio 2015(定义类似于 zos pthread_t
的自定义 mypthread
结构)编译此代码而不会出错。你知道为什么 xlc++ 这个转换有问题吗?演员标准是否符合?
#define _OPEN_THREADS
#include <iostream>
#include <stdint.h>
#include <pthread.h>
pthread_t apr_os_thread_current() {
return pthread_t();
}
int64_t getId() {
pthread_t tmp = apr_os_thread_current();
return (int64_t) tmp.__; // ok
//return (int64_t) apr_os_thread_current().__; // CCN5216
//return reinterpret_cast<int64_t>(apr_os_thread_current().__); // CCN5216
}
int main() {
std::cout << getId() << std::endl;
return 0;
}
没有临时变量,数组是右值的一部分,这可能会抑制隐式 array-to-pointer 转换,要求 char[8]
直接重新解释为 int64_t
。
引入临时变量(左值)启用 tmp.__
上的 array-to-pointer 转换,然后将指针强制转换为 int64_t
而没有任何 "problem",实际上返回一个虚假价值。换句话说,您的 working/compiling 代码等同于以下内容:
return (int64_t) &tmp.__[0]; // ok ???
这只是一个假设,您可以按如下方式检查:
int64_t getId() {
pthread_t tmp = apr_os_thread_current();
int64_t result = (int64_t) tmp.__;
if ( result == (int64_t) &tmp.__[0] )
std::cerr << "oops!" << std::endl;
return result;
}