- 主题:问个奇怪的对象初始化问题 : A a = b; // B b;
假设 B b;
A和B不同类型, 那么
cpp标准说 A a = b; 是一定走构造函数的吧, 如果a和b是不同类型, 会首先调用
B到A的转换函数?
如果B和A之间存在其他通道呢?
比如A:
A::A(C* c);
对于B有转换到C*的算子:
class B{
operator C*() const;
}
c++ 标准有规定只要存在转换通道, 就必须完成 b--> C* --> A::A(C*) 这个过程吗?
vs2015似乎可以, 但是g++不认
--
FROM 120.244.224.*
没研究过,一般只能是继承关系才能这么转换的吧?
不同的怎么转?虚表里面函数都不一样
不过好像有印象在哪里看到过这种分析,编译器内部是怎么做这个操作的,忘了是哪里了
好像是类变量和虚表什么的都一致是能转成功的
--
FROM 117.136.38.*
// 代码来了, 下面的代码 vs2015能过, 走转换-构造通道, 但是g++就不给过, 提示
: error: conversion from 'B' to non-scalar type 'A' requested
那么问题来了, 我如果想办法让gcc过了, 那vs和gcc的编译后软件行为居然不一样?
同一份代码, 在两个编译器下执行结果不一样的问题, 是普遍的吗?
#include <stdio.h>
struct A;
struct B
{
B(int *p = nullptr) : m_p(p) {}
operator int* () const {
puts("[called] operator int* () const ");
return m_p;
}
// data
int* m_p = nullptr;
};
struct A
{
A(const int *p) : m_p((int*)p) { puts("[called] A(const int *p) "); }
//data:
int* m_p = nullptr;
};
int main()
{
B b;
A a = b;
printf("a.p:%p b.p:%p\n", a.m_p, b.m_p);
}
【 在 xieyf ( meitian ) 的大作中提到: 】
: 假设 B b;
: A和B不同类型, 那么
: cpp标准说 A a = b; 是一定走构造函数的吧, 如果a和b是不同类型, 会首先调用
: ...................
--
FROM 120.244.224.*
先不说虚表, 就是pod平凡类.
【 在 howry (howry) 的大作中提到: 】
: 没研究过,一般只能是继承关系才能这么转换的吧?
: 不同的怎么转?虚表里面函数都不一样
: 不过好像有印象在哪里看到过这种分析,编译器内部是怎么做这个操作的,忘了是哪里了
: ...................
--
FROM 120.244.224.*
【 在 xieyf 的大作中提到: 】
: 先不说虚表, 就是pod平凡类.
:
总感觉会编译出错
你可以反汇编进去分析
--
FROM 117.136.38.*
我看的说法是隐式转换只发生一次,无法一次转换到目标类型就失败?
--
FROM 158.140.1.*
这个确实很神奇, 如果换成A a(b), g++ 也能编译过.
为什么A a =b, A a(b) 这两种写法不等价.
【 在 allegro (静水流深) 的大作中提到: 】
: 我看的说法是隐式转换只发生一次,无法一次转换到目标类型就失败?
--
FROM 120.244.224.*
前者是copy constructor,后者是一般的constructor。
【 在 xieyf ( meitian ) 的大作中提到: 】
: 这个确实很神奇, 如果换成A a(b), g++ 也能编译过.
: 为什么A a =b, A a(b) 这两种写法不等价.
--
FROM 101.84.34.*
如下代码,在C++20情况下,所有编译器都报错
#include <iostream>
struct C { C() { std::cout << "Constructs C" << std::endl; } };
struct A {
A() { std::cout << "Constructs A" << std::endl; }
A(const C & c) { std::cout << "Constructs A from C" << std::endl; }
};
struct B {
B() { std::cout << "Constructs B" << std::endl; }
operator C () const { return C(); }
};
int main() {
B b;
A a = b;
// Okay in all compilers.
// A a(b);
return 0;
}
在C++11标准下,VS 2019 编译通过,VS2019自带的Clang10编译报错,MinGW下gcc 8.1报错。
【 在 xieyf 的大作中提到: 】
: 假设 B b;
: A和B不同类型, 那么
: cpp标准说 A a = b; 是一定走构造函数的吧, 如果a和b是不同类型, 会首先调用
: ...................
--
FROM 222.129.54.*
对, 是不是vs不守规范?
【 在 ble (ble) 的大作中提到: 】
: 如下代码,在C++20情况下,所有编译器都报错
: #include <iostream>
: struct C { C() { std::cout << "Constructs C" << std::endl; } };
: ...................
--
FROM 120.244.224.*