У меня есть конструктор класса C из int и один из double.
Я позволяю первому делать неявное преобразование типов, но блокирую второе, используя ключевое слово явное.
но, к сожалению, возникает неявное преобразование double to int. Могу ли я как-то его заблокировать?
Вот упрощенный пример
//g++ 5.4.0
#include <iostream>
using namespace std;
class C{
int* tab;
public:
C():tab(nullptr){ cout<<"(void)create zilch\n"; }
C(int size):tab(new int[size]){ cout<<"(int)create " << size << "\n"; }
explicit C(double size):tab(new int[(int)size]){ cout<<"(double)create " << size << "\n"; }
~C(){ if(tab) {cout<<"destroy\n"; delete[] tab;} else cout <<"destroy zilch\n"; }
};
int main()
{
cout << "start\n";
{
C o1(1);
C o2 = 2; //ok, implicit conversion allowed
C o3(3.0);
C o4 = 4.0; //ko, implicit conversion to double blocked... but goes to int
}
cout << "stop\n";
}
//trace
//
//start
//(int)create 1
//(int)create 2
//(double)create 3
//(int)create 4
//destroy
//destroy
//destroy
//destroy
//stop
new
иdelete
в C++. Это низкоуровневые операции. В вашем примере используйтеstd::vector<int>
. - person Mikhail   schedule 12.02.2020new
, поэтому утверждение «никогда» вводит в заблуждение. - person 463035818_is_not_a_number   schedule 12.02.2020C(double size)
, а затем обращение кsize
как кint
— плохой дизайн. Я бы посоветовал явно объявитьC(double size)
иC& operator=(double)
членамиprivate
и не реализовывать их. - person R Sahu   schedule 12.02.2020double
, или вы действительно хотите сохранить оба конструктора? - person 463035818_is_not_a_number   schedule 12.02.2020template<typename T> C(T) = delete;
для подавления других неявных преобразований. - person Eljay   schedule 12.02.2020template<typename I, typename = typename std::enable_if<std::is_integral<I>::value>::type> C(I size): tab(new int[size]) {...}
. Вам также потребуется#include <type_traits>
. - person arayq2   schedule 12.02.2020