最近我很惊讶std::unique_ptrSTL容器的元素是可以接受的,因为我认为这些元素需要提供以下功能(这个页面说的相同):
但是std::unique_ptr不能复制使它所拥有的指针由单个对象拥有,这与上述要求相矛盾.
标准是否改变了要求?如果是这样,有什么变化?也许可移动物体或可复制物体都足够了?我在网上搜索了自C++ 11以来需求是否发生了变化,但我找不到任何帮助我的页面...
有没有办法检查任意变量类型是否可迭代?
那么要检查它是否有索引元素,或者我可以实际循环它的孩子?(例如使用foreach?)
是否可以为此创建通用模板?
我在搜索时找到了其他编程语言的技巧.然而,仍然必须找到如何在C++中做到这一点.
我想知道是否可以转发声明在另一个类范围内定义的枚举.例如,请考虑以下事项:
//A.h
class A
{
public:
enum class type: unsigned long { /*some stuff*/ }
};
Run Code Online (Sandbox Code Playgroud)
现在,在另一个标题中,我想转发声明'type'枚举(假设下面的B类有一个用A :: type做某事的函数)
//B.h
enum A::type; //use of undefined type 'A'
class B
{
public:
UseTypeEnum(A::Type&);
};
Run Code Online (Sandbox Code Playgroud)
这也不起作用:
//B.h
class A;
enum A::type; //still use of undefined type
class B...
Run Code Online (Sandbox Code Playgroud)
如果在Ah中将枚举声明为全局范围,则没有问题
有没有办法做到这一点?
在回答有关使用枚举的重载解析的问题时,出现了此问题.
虽然案例long long肯定是MSVC2012NovCTP中的一个错误(根据标准文本和gcc 4.7.1的测试),我无法弄清楚为什么会出现以下行为:
#include <iostream>
enum charEnum : char { A = 'A' };
void fct(char) { std::cout << "fct(char)" << std::endl; }
void fct(int) { std::cout << "fct(int)" << std::endl; }
void fct(long long) { std::cout << "fct(long long)" << std::endl; }
int main()
{
fct('A');
fct(A);
}
Run Code Online (Sandbox Code Playgroud)
MSVC2012NovCTP和gcc 4.7.1都同意此输出:
fct(char)
fct(int)
不A应该转换charEnum为char?为什么A被转换成int?
编辑:clang抱怨说这个电话含糊不清,这与我在下面的解释一致; 那说,如果它只被认为是潜在的类型,我仍然会发现它更直观.
两个相关的标准摘录是§7.2/ 9:
枚举器的值或未范围的枚举类型的对象通过整数提升转换为整数(4.5)
并且§4.5/ 4:
其底层类型为固定(7.2)的无范围枚举类型的prvalue可以转换为其基础类型的prvalue.此外,如果可以对其基础类型应用整数提升,则其基础类型固定的未范围枚举类型的prvalue也可以转换为提升的基础类型的prvalue.
因此, …
当我进入SCARY迭代器主题时,我正在阅读有关VC11的C++ 11功能的VC11博客.
什么是SCARY迭代器?这对我的C++编码体验有何影响?
错误如下:
请求'arr'中的成员'begin','end'是非类型int [5],无法从表达式错误中推断出来.
我的代码:
#include <iostream>
using namespace std;
int main()
{
int * mypointer;
int arr[5] = {1,3,5,7,9};
mypointer = arr;
for(auto it = arr.begin(); it != arr.end(); ++it) {
cout<<*mypointer<<endl;
mypointer++;
}
return 0;
}
Run Code Online (Sandbox Code Playgroud) 在模板元编程中,可以在返回类型上使用SFINAE 来选择某个模板成员函数,即
template<int N> struct A {
int sum() const noexcept
{ return _sum<N-1>(); }
private:
int _data[N];
template<int I> typename std::enable_if< I,int>::type _sum() const noexcept
{ return _sum<I-1>() + _data[I]; }
template<int I> typename std::enable_if<!I,int>::type _sum() const noexcept
{ return _data[I]; }
};
Run Code Online (Sandbox Code Playgroud)
但是,这对构造函数不起作用.假设,我想声明构造函数
template<int N> struct A {
/* ... */
template<int otherN>
explicit(A<otherN> const&); // only sensible if otherN >= N
};
Run Code Online (Sandbox Code Playgroud)
但不允许这样做otherN < N.
那么,SFINAE可以在这里使用吗?我只对允许自动模板参数扣除的解决方案感兴趣
A<4> a4{};
A<5> a5{};
A<6> …Run Code Online (Sandbox Code Playgroud) 许多语言都有电力运营商; 为什么不用C++?例如,Fortran和Python使用**并且通常使用(例如在LaTeX中)编写^.
可能重复:
如何使用cout以完全精度打印double值?
float a = 175.;
cout << a;
Run Code Online (Sandbox Code Playgroud)
如果我运行前面的代码我将只得到175,我怎么能用(例如)3个小数位来输出数字,即使它们是零...我怎么能打印"175.000"?
考虑以下代码:
#include <iostream>
using namespace std;
void Func(int&& i) {
++i;
}
int main() {
int num = 1234;
cout << "Before: " << num << endl;
Func(std::move(num));
cout << "After: " << num << endl;
}
Run Code Online (Sandbox Code Playgroud)
它的输出是:
Before: 1234
After: 1235
Run Code Online (Sandbox Code Playgroud)
显然,i正在内部进行修改Func,因为它i在被"转换"为r值引用之后被绑定到参数std::move.
好吧,我的观点:
移动对象意味着将资源的所有权从一个对象转移到另一个对象.但是,内置类型不包含资源,因为它们本身就是资源.转移他们持有的资源毫无意义.如示例所示,num修改了s值.它的资源,它的自我,是被修改的资源.
内置类型有移动语义吗?
另外,内置类型对象在移动后(如果是)是一个明确定义的行为吗?
c++ ×10
c++11 ×7
arrays ×2
constructor ×1
cout ×1
enums ×1
formatting ×1
iterable ×1
iterator ×1
overloading ×1
pointers ×1
sfinae ×1
stl ×1