c++ - 类型转换感知的数字文字

标签 c++

据我所知,在 C 和 C++ 中,不同的数字文字有不同的类型。例如:

  • 0 的类型为 int
  • 0u 的类型为 unsigned int
  • 0.0 的类型为 double
  • 0.0f 的类型为 float
    等等

因此,如果您使用文字值初始化变量,则该文字的类型必须与该变量相同,否则将进行类型转换来执行分配:

int i = 0.0;

这似乎是一个愚蠢的转换,并且因为文字的值在编译时是已知的,所以编译器可以轻松地避免该转换并以正确的格式分配值(有符号整数而不是 float ,在这个例子)。

我的问题很简单:是否保证任何像样的(或者至少是任何现代编译器,我正在使用 GCC 4.8.2)消除该转换?

我正在为代数编写几个通用类,并且我担心使用文字进行初始化,如下所示:

template<typename T>
struct vector_2d
{
    T x , y;

    vector_2d( T xx , T yy ) : x( xx ) , y( yy ) {}

    //Initializations like this:
    vector_2d() : vector_2d( 0 , 0 ) {}
};

因为我不知道T是哪种类型,所以当类型为float等时我无法使用0.0f。当然,我不会编写模板专门化来捕获不同类型的参数:P

最佳答案

您可以使用值初始化来获取适当类型的“零”值。

vector_2d() : vector_2d( T() , T() ) {}

vector_2d() : x(), y() {}

当然,这只适用于零。对于其他值,您需要一个 constexpr 函数模板,如 Nikolay 评论的那样。

template<typename TResult, typename TFrom>
constexpr TResult compiletime_conversion(const TFrom val)
{
    TResult result = val;
    return result;
}

关于c++ - 类型转换感知的数字文字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20827736/

相关文章:

c++ - 为接口(interface)和实现设置单独的命名空间是否值得?

c++ - 如何让 CUDA 的 printf 打印到任意流?

c++ - 构造函数中私有(private)成员初始化的差异(C++)

c# - 将 C# 结构传递给 C++ 非托管 DLL 返回不正确的结果

c++ - 使 QDialog 成为操作系统的模态

c++打印枚举值

c++ - 如何初始化和使用静态结构

c++ - 从私有(private)类变量释放内存

c++ - 无法为 clang 指定额外的链接文件

c++ - 扫描用户输入以查找数组中声明的字符串