像许多人一样,我一直在尝试C + 11带来的不同功能.我最喜欢的一个是"基于范围的循环".
我明白那个:
for(Type& v : a) { ... }
Run Code Online (Sandbox Code Playgroud)
相当于:
for(auto iv = begin(a); iv != end(a); ++iv)
{
Type& v = *iv;
...
}
Run Code Online (Sandbox Code Playgroud)
而这begin()
只是返回a.begin()
标准容器.
但是,如果我想让我的自定义类型"基于范围的循环" - 意识到什么?
如果我只是专注begin()
和end()
?
如果我的自定义类型属于命名空间xml
,我应该定义xml::begin()
还是std::begin()
?
简而言之,这样做的准则是什么?
问题是如何将wstring转换为字符串?
我有下一个例子:
#include <string>
#include <iostream>
int main()
{
std::wstring ws = L"Hello";
std::string s( ws.begin(), ws.end() );
//std::cout <<"std::string = "<<s<<std::endl;
std::wcout<<"std::wstring = "<<ws<<std::endl;
std::cout <<"std::string = "<<s<<std::endl;
}
Run Code Online (Sandbox Code Playgroud)
注释掉的输出是:
std::string = Hello
std::wstring = Hello
std::string = Hello
Run Code Online (Sandbox Code Playgroud)
但不仅仅是:
std::wstring = Hello
Run Code Online (Sandbox Code Playgroud)
这个例子有什么不对吗?我可以像上面那样进行转换吗?
编辑
新的例子(考虑到一些答案)是
#include <string>
#include <iostream>
#include <sstream>
#include <locale>
int main()
{
setlocale(LC_CTYPE, "");
const std::wstring ws = L"Hello";
const std::string s( ws.begin(), ws.end() );
std::cout<<"std::string = "<<s<<std::endl;
std::wcout<<"std::wstring = "<<ws<<std::endl;
std::stringstream ss;
ss …
Run Code Online (Sandbox Code Playgroud) [dcl.attr.noreturn]提供以下示例:
[[ noreturn ]] void f() {
throw "error";
// OK
}
Run Code Online (Sandbox Code Playgroud)
但我不明白有什么意义[[noreturn]]
,因为函数的返回类型已经存在void
.
那么,该noreturn
属性的重点是什么?它应该如何使用?
#include <iostream>
struct a {
enum LOCAL_A { A1, A2 };
};
enum class b { B1, B2 };
int foo(int input) { return input; }
int main(void) {
std::cout << foo(a::A1) << std::endl;
std::cout << foo(static_cast<int>(b::B2)) << std::endl;
}
Run Code Online (Sandbox Code Playgroud)
这a::LOCAL_A
是强类型枚举试图实现的,但有一个小的区别:普通枚举可以转换为整数类型,而强类型枚举不能没有强制转换.
那么,有没有办法将强类型的枚举值转换为没有强制转换的整数类型?如果有,怎么样?
我正在研究多线程应用程序,我想使用GDB进行调试.
问题是,我的一个线程一直在消息中消失:
pure virtual method called
terminate called without an active exception
Abort
Run Code Online (Sandbox Code Playgroud)
我知道该消息的原因,但我不知道我的帖子在哪里发生.回溯真的很有帮助.
当我在GDB中运行我的应用程序时,每次线程暂停或恢复时它都会暂停.我希望我的应用程序继续正常运行,直到其中一个线程因该异常而死亡,此时所有内容都应该暂停,以便我可以获得回溯.
有没有办法通过使矢量重复来扩展矢量?
>v = [1 2];
>v10 = v x 5; %x represents some function. Something like "1 2" x 5 in perl
Run Code Online (Sandbox Code Playgroud)
然后v10将是:
>v10
1 2 1 2 1 2 1 2 1 2
Run Code Online (Sandbox Code Playgroud)
这应该适用于一般情况,而不仅仅是[1 2]
当我遇到计算立方体体积的函数时,我正在阅读我的C++书籍(Deitel).代码如下:
double cube (const double side){
return side * side * side;
}
Run Code Online (Sandbox Code Playgroud)
使用"const"限定符的解释是这样的:"const限定应该用于强制执行最小特权原则,告诉编译器函数不修改变量端".
我的问题:这里不是使用"const"冗余/不必要的,因为变量是通过值传递的,所以函数无论如何都不能修改它?
在C++中,11 basic_string::c_str
被定义为完全相同basic_string::data
,而后者又定义为*(begin() + n)
和*(&*begin() + n)
(when 0 <= n < size()
)完全相同.
我找不到任何要求字符串在其末尾始终具有空字符的内容.
这是否意味着c_str()
不再保证生成以null结尾的字符串?
我想在谷歌测试中比较两个数组.在UnitTest ++中,这是通过CHECK_ARRAY_EQUAL完成的.你是如何在谷歌测试中做到的?
确定给定的浮点数arg是否正常,即既不是零,也不是正常,无限,也不是NaN.
数字为零,无限或NaN很清楚它意味着什么.但它也说低于正常.什么时候是一个数字次正常?
c++ ×9
c++11 ×5
attributes ×1
const ×1
debugging ×1
for-loop ×1
gdb ×1
googletest ×1
ieee-754 ×1
matlab ×1
multicore ×1
noreturn ×1
octave ×1
polymorphism ×1
stl ×1
string ×1
unicode ×1
unit-testing ×1
vector ×1
wstring ×1