相关疑难解决方法(0)

为什么缩小使用花括号分隔初始值设定项的转换会导致错误?

我在"C++编程语言"第4版中学习了大括号分隔初始化器.>第2章:C++之旅:基础知识.

我引用下面的书.

=表格是传统的并且可以追溯到C,但是如果有疑问,请使用通用{} -list表单(第6.3.5.2节).如果不出意外,它可以帮助您避免丢失信息的转换(缩小转化次数;§10.5):

int i1 = 7.2;    // i1 becomes 7
int i2 {7.2};    // error : floating-point to integer conversion
int i3 = {7.2};  // error : floating-point to integer conversion (the = is redundant)
Run Code Online (Sandbox Code Playgroud)

但是,我无法重现这些结果.

我有以下代码.

#include <iostream>

int main()
{
    int i1 = 7.2;
    int i2 {7.2};
    int i3 = {7.2};

    std::cout << i1 << "\n";
    std::cout << i2 << "\n";
    std::cout << i3 << "\n";
}
Run Code Online (Sandbox Code Playgroud)

当我编译并运行它时,我没有得到任何错误.我收到警告,std=c++11但没有错误.

$ g++ init.cpp 
init.cpp: In function …
Run Code Online (Sandbox Code Playgroud)

c++ narrowing c++11

13
推荐指数
2
解决办法
1267
查看次数

自动带括号和初始化列表

来自另一个问题:

由于C++ 17,auto x0{1, 2, 3, 4};以前推断出初始化列表,不再允许(当然,我们可以使用auto x0 = {1, 2, 3, 4};...).现在一如既往地避免统一初始化(例如std::vector<int> v({1, 2, 3, 4});,使用初始化列表作为参数进行显式构造函数调用),并且类似于定义良好auto x(7);(我不会自己使用的构造......),我想出了以下内容:

auto x({1, 2, 3, 4});
// -> std::initializer_list<int> x({1, 2, 3, 4});
Run Code Online (Sandbox Code Playgroud)

这是用GCC 7.2.0(mingw64)编译的,但是发出警告(而评论版再次没有):

list-initializer for non-class type must not be parenthesized

我在标准中找不到任何相关内容,所以现在的问题是(出于纯粹的兴趣......):

为什么不允许这样做?(这是否被标准所涵盖,或者我们是否需要将此视为GCC错误?)

c++ initializer initializer-list language-lawyer c++17

12
推荐指数
1
解决办法
387
查看次数

从nullptr_t转换为bool:有效与否?

我用3个编译器测试了以下代码,得到了3个不同的结果:错误,警告和确定.

  • GCC(5.3):错误:从'std :: nullptr_t'到'const Thing&'的用户定义转换无效
  • Clang(3.8):警告:将nullptr常量隐式转换为'bool'
  • MSVC(14.1):没有错误,没有警告

哪个编译器正确?我知道这是指针类型和bool.之间的微不足道的转换.但那是什么std::nullptr_tbool

(最后,Clang和MSVC对代码都很好.Clang以积极的方式更加冗长.)

struct Thing
{
    Thing(bool) {}
};

void addThing(const Thing&){}

int main()
{
    addThing(nullptr); // warning or error on this line
}
Run Code Online (Sandbox Code Playgroud)

c++ compiler-errors type-conversion language-lawyer c++11

8
推荐指数
1
解决办法
822
查看次数