为什么xlc ++编译器会抱怨转换rvalue?

时间:2017-01-27 10:33:17

标签: c++ zos xlc

在z / OS上,pthread_t类型是包含成员char __[8];的结构。我试图将其从返回值转换为int64_t。我收到了以下错误:

  

CCN5216(S)“char [8]”类型的表达式无法转换为“int64_t”类型

但如果我使用临时变量tmp,它就可以了。我可以使用Visual Studio 2015(定义类似于zos mypthread的自定义pthread_t结构)编译此代码而不会出现错误。你知道为什么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;
}

1 个答案:

答案 0 :(得分:1)

如果没有临时变量,则数组是rvalue的一部分,这可能会禁止隐式数组到指针的转换,需要将char[8]直接重新解释为int64_t

引入临时变量(左值)可以在tmp.__上进行数组到指针转换,然后指针被转换为int64_t而没有任何“问题”,实际上返回了一个虚假的值。换句话说,您的工作/编译代码等同于以下内容:

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;
}