我有以下代码.
#include <utility>
#include <list>
#include <iostream>
class Pair: public std::pair<unsigned int, unsigned int>{
Pair (unsigned int h, unsigned int l) : pair(h,l){};
};
class PairList: public std::list<Pair>{};
int main(int argc, char** argv){
PairList pl = {{800,400},{800,400}};
}
Run Code Online (Sandbox Code Playgroud)
我使用命令行使用MinGW g ++ v4.6编译它
g++ -std=c++0x Test.cpp -o test.exe
并得到错误:
error: could not convert '{{800, 400}, {800, 400}}' from '<brace-enclosed initializer list>' to 'PairList'
但是如果在main()中我写的
list<pair<unsigned int,unsigned int>> pl = {{800,400},{800,400}};
一切正常.
WTF?
我有一个简单布局的结构,类似于:
struct A
{
int a,b;
};
Run Code Online (Sandbox Code Playgroud)
我已经在整个地方使用统一初始化来创建我的结构,如:
A obj{2,3};
Run Code Online (Sandbox Code Playgroud)
后来,我在A中添加了一个构造函数.它现在看起来像:
struct A
{
int a,b;
A(){}
};
Run Code Online (Sandbox Code Playgroud)
这打破了统一初始化的使用.有没有一种简单的方法可以让这项工作重新开始.也许通过使用默认关键字?
我希望有一些简单的东西,以匹配我的简单结构.
通过转发就地构造,我指的是std :: allocator :: construct和各种emplace方法,例如std :: vector :: emplace_back.我只是发现在C++中转发的就地构造不能(无法?)利用列表初始化语法.结果,似乎人们永远无法就地构建聚合.我只是想确定转发的就地构造是否不支持列表初始化,因此也不支持聚合类型.这是由于语言的限制吗?有人可以提供有关此问题的标准吗?以下是一个例子:
虽然我们可以直接进行就地施工
int(*p)[3] = ...;
new(p) int[3]{1, 2, 3};
Run Code Online (Sandbox Code Playgroud)
我们不能做就地转发就像
std::allocator<int[3]> allo;
allo.construct(p, 1, 2, 3);
Run Code Online (Sandbox Code Playgroud) c++ object-construction language-lawyer c++11 list-initialization
考虑以下程序:
#include <iostream>
int main()
{
int n = 3;
int fact = 1;
for(auto i{1};i<=n;i++)
fact*=i;
std::cout<<"fact of "<<n<<" is "<<fact;
}
Run Code Online (Sandbox Code Playgroud)
即使我使用-std=c++14选项,它也可以在ideone上编译.在这里查看现场演示.但是在C++ 14中,变量i应该initializer_list根据此推断出来.
有一个C++ 1z的提议,它为括号初始化实现了新的类型推导规则:
对于直接列表初始化:
对于只包含单个元素的braced-init-list,自动扣除将从该条目中推断出来;
对于具有多个元素的braced-init-list,自动扣除将是不正确的.
[例:
auto x1 = {1,2}; // decltype(x1)是std :: initializer_list
auto x2 = {1,2.0}; //错误:无法推断出元素类型
auto x3 {1,2}; //错误:不是单个元素
auto x4 = {3}; // decltype(x4)是std :: initializer_list
auto x5 {3}; // decltype(x5)是int.
- 结束例子]
所以,规则改变了C++ 17.因此,当我使用时,程序不应该编译-std=c++14.这是g ++中的错误吗?这个变量不应该i像 …
int a = 0; short b{a}; short c{0};
编译器给出了一个警告short b{a}.我能理解这一点,因为int它缩小了short.
但是,它没有给出警告short c{0},这对我来说很奇怪.我记得文字整数,0至少应该是这种类型int.因此,从缩小int到short发生在这里.为什么编译器没有发出警告?
c++ initialization language-lawyer narrowing list-initialization
要理解这个问题,请先阅读此答案.
我检查了不同的历史make_tuple实现(包括2012年的clang版本).在C++ 17之前我会期望它们,return {list of values ... }但它们都会在返回之前构造元组.它们都是非常简化的当前cppreference示例:
template <class... Types>
auto make_tuple(Types&&... args)
{
return std::tuple<special_decay_t<Types>...>(std::forward<Types>(args)...);
}
Run Code Online (Sandbox Code Playgroud)
它没错,但返回大括号初始化的重点是直接构造返回的对象.在C++ 17之前,没有保证的复制省略甚至在概念上消除了临时性.但即使使用C++ 17,我也不一定会期望花括号在这个例子中消失.
为什么在任何C++ 11/14实现中都没有花括号?换句话说,为什么不呢
template <class... Types>
std::tuple<special_decay_t<Types>...> make_tuple(Types&&... args)
{
return {std::forward<Types>(args)...};
}
Run Code Online (Sandbox Code Playgroud) 我需要知道如何访问和初始化一系列包含其他字典的字典。例如,如果我有
class Conv{
Dictionary<int, Dictionary<int, Dictionary<int, List<double>>>> valori;
}
Run Code Online (Sandbox Code Playgroud)
我想用随机数启动参数“valori”,我该怎么做?我会这样做
valori[n1].Values[n2].Values[n3]
Run Code Online (Sandbox Code Playgroud)
但是在第一个“Value”之后,MVS 给了我一个错误。也许我必须先分配内存?我学了一点 c++,但我对 c# 仍然很陌生,如果我忘记了问题中的重要内容,请告诉我
当我试图计算它们时
char l[] {'t', 'r', 'y'};
std::cout << l << std::endl;
Run Code Online (Sandbox Code Playgroud)
我尝试在终端中打印。然而,当我尝试这样做时。
char l[] {'try'};
Run Code Online (Sandbox Code Playgroud)
我只得到了y。
我从 python 转向 c++,所以很多事情对我来说没有意义,所以你能解释一下这两个表达式的区别吗?
根据这个网站/链接/:
如果显式声明默认构造函数但将其标记为已删除,则不能使用空大括号初始化:
它还给出了一个例子:
class class_f {
public:
class_f() = delete;
class_f(string x): m_string { x } {} // if it is deleted, there will be no errors.
string m_string;
};
int main()
{
class_f cf{ "hello" };
class_f cf1{}; // compiler error C2280: attempting to reference a deleted function
}
Run Code Online (Sandbox Code Playgroud)
我真正不明白的是,如果没有用户提供的构造函数,即使删除的默认构造函数仍然存在,也不会再出现错误。据我所知,如果有用户提供的构造函数,就不会存在隐式的默认构造函数,但默认构造函数已经被删除了。所以我不知道在值初始化的情况下调用什么以及为什么它在下面的示例中起作用:
#include <string>
class class_f {
public:
class_f() = delete;
std::string m_string;
};
int main()
{
class_f cf1{}; // Does the implicit-default constructor is called here? But, it …Run Code Online (Sandbox Code Playgroud) 这是一个例子:
int main ()
{
int a[] = {1, 2, 3,};
}
Run Code Online (Sandbox Code Playgroud)
,注意后面的额外内容3。-Wall即使一切都没有警告。我在阅读一些coreutils代码时注意到这一点,这些代码似乎在数组的最后一个元素后面有一个逗号。这个 UB 是实现定义的还是按原样就可以?