当前位置: 首页 > 知识库问答 >
问题:

是否可以在允许显式转换的同时不推荐隐式转换?

养慈
2023-03-14
class Duration
{
    int seconds;
public:
    Duration(int t_seconds) : seconds(t_seconds) { }
};

int main()
{
    Duration t(30);
    t = 60;
}
class Duration
{
    int seconds;
public:
    explicit Duration(int t_seconds) : seconds(t_seconds) { }
};

int main()
{
    Duration t(30); // This is fine, conversion is explicit
    t = 60; // Doesn't compile: implicit conversion no longer present for operator=
}
class Duration
{
    int seconds;
public:
    [[deprecated]]
    Duration(int t_seconds) : seconds(t_seconds) { }

    explicit Duration(int t_seconds) : seconds(t_seconds) { }
};

int main()
{
    Duration t(30); // Compiles, no warnings, uses explicit constructor
    t = 60; // Compiles but emits a deprecation warning because it uses implicit conversion
}

这将允许编译现有代码,同时识别当前依赖隐式转换的任何地方,因此可以重写它们以使用显式转换,如果不是,则重写它们以具有正确的行为。

但是,这是不可能的,因为我不能用duration::duration(int)重载duration::duration(int)

除了“使转换显式化,接受调用代码在编写适当的更改之前不会编译”之外,有没有一种方法可以实现类似的效果?

共有1个答案

宋华美
2023-03-14

您可以将duration(int t_seconds)转换为一个模板函数,该函数可以接受int并将其设置为deprecated。

#include<concepts>

class Duration {
  int seconds;
public:
  template<std::same_as<int> T>
  [[deprecated("uses implicit conversion")]]
  Duration(T t_seconds) : Duration(t_seconds) { }
  
  explicit Duration(int t_seconds) : seconds(t_seconds) { }
};

如果允许t=0.6,只需将same_as更改为convertible_to

演示。

 类似资料:
  • 来自标书§4.2.7http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2021/p0847r7.html#pathological-案例 它说: 这些更不可能是真正有用的代码。在此示例中,既不能转换为也不能转换为,因此这些函数甚至都不能使用普通成员语法调用。但是,您可以获取指向此类函数的指针并通过该指针调用它们。

  • 问题内容: “隐式转换”和“显式转换”有什么区别?Java和C ++的区别是否不同? 问题答案: 显式转换是您使用某种语法 告诉 程序进行转换的地方。例如(在Java中): 隐式转换是在没有任何语法的情况下进行转换的地方。例如(在Java中): 应该注意的是(在Java中)涉及原始类型的转换通常涉及某种表示形式的更改,并且可能导致精度降低或信息丢失。相比之下,仅涉及引用类型的转换不会更改基本表示形

  • 本文向大家介绍JavaScript中的一些隐式转换和总结(推荐),包括了JavaScript中的一些隐式转换和总结(推荐)的使用技巧和注意事项,需要的朋友参考一下 js中的不同的数据类型之间的比较转换规则如下: 1. 对象和布尔值比较 对象和布尔值进行比较时,对象先转换为字符串,然后再转换为数字,布尔值直接转换为数字 2. 对象和字符串比较 对象和字符串进行比较时,对象转换为字符串,然后两者进行比

  • 以下代码在C++11中编译成功: 它包括用于现代C++的JSON。一个工作示例在这个Wandbox中。 JSON变量被隐式转换为字符串。但是,如果我取消最后一行的注释,这是一个显式转换,它将无法编译。这里的编译结果。 除了这个json库的特殊细微差别之外,如何编写一个类,使隐式转换工作,而显式转换不工作? 是否有某种构造函数限定符允许这种行为?

  • 我有一个结构,下面的运算符声明: 仅此运算符就可以将不可为null的结构隐式转换为int,但尝试隐式转换其可为null的对应结构仍会引发编译错误: 无法隐式转换类型