我试图将unsigned short转换为大写的十六进制表示,并使用stringstream将前缀为0.我似乎无法得到大写和0的正确.这是我现在拥有的:
USHORT id = 1127;
std::stringstream ss;
ss << std::showbase << std::uppercase << std::setfill('0') << std::setw(4) << std::hex << id;
std::string result = ss.str();
Run Code Online (Sandbox Code Playgroud)
这导致前缀'0x'也是大写的,但我希望它是小写的.它还导致在前缀0x base(当前为0X)之后没有前缀0到十六进制值.例如,现在将输出0X467而不是预期的0x0467.我该如何解决?
有人可以提供一些见解吗?lambda是捕获外部变量,还是外部世界捕获lambda产生的值?捕获某个变量意味着什么?
以下C++ 11代码在我的GCC 4.8上成功编译:
struct NonStack
{
private:
NonStack() = default;
public:
static NonStack* Create(){
return new NonStack;
}
};
NonStack a;
int main() { }
Run Code Online (Sandbox Code Playgroud)
但是,以下给出了编译错误:
struct NonStack
{
private:
NonStack(){}
};
NonStack a;
int main() { }
Run Code Online (Sandbox Code Playgroud)
为什么第一个成功?私有默认构造函数不应该通过禁止创建对象NonStack a;吗?
考虑在迭代时从关联容器中删除元素的规范算法:
for (auto iter = myMap.begin(); iter != myMap.end(); )
{
if (/* removal condition */)
{
iter = myMap.erase(iter);
}
else
{
++iter;
}
}
Run Code Online (Sandbox Code Playgroud)
在使用C++ 11 std::unordered_map容器时,我一直在不加思索地应用这个算法.但是,在浏览cppreference.comstd::unordered_map::erase上的文档之后,在阅读以下注释后我变得有点担心:
保留未擦除元素的顺序(这使得可以在迭代容器时擦除单个元素)(从C++ 14开始)
基于这个陈述,我假设在C++ 14标准中添加了语言,以确保库实现者在调用后保证排序std::unordered_map::erase.例如,这样的要求可能会限制实现在删除元素后不重新整理整个容器,而只是允许它从相应的存储桶中删除元素?
如果我在C++ 11中没有这样的保证,并且如果我希望我的代码是可移植的,那么如果我std::unordered_map在迭代期间删除一个元素,我是否必须担心一些元素会被访问多次或根本不访问?
根据投掷的cppreference std::get,如果包含的类型不是预期的类型.这意味着标准库必须检查每次访问(libc ++).variantstd::bad_variant_accessvariant
这个决定的理由是什么?为什么它不是未定义的行为,就像C++中的其他地方一样?我可以解决吗?
最近我了解到function's reference qualifiers,例如
struct foo
{
void bar() {}
void bar1() & {}
void bar2() && {}
};
Run Code Online (Sandbox Code Playgroud)
我可能需要此功能的地方,这个语言功能是否有任何实际用例?
我最近一直在学习C++,并且今天已经介绍了const和const正确性的概念.为了更好地理解这个理论,我一直在编写一系列简单的程序来确保我理解这个概念.我以为我理解了一切,但是当在其中一个程序中使用auto关键字时,我似乎有点卡住了.
为了测试我理解const指针是如何工作的,我编写了一个简单的程序.我不打算发布整件事,因为它只有两部分是相关的.我有一个类型为int的const数据成员的类:
const int tryToChangeMe;
Run Code Online (Sandbox Code Playgroud)
在这个类中,我还有一个成员函数,它返回一个指向上面的const int的const指针:
const int* const MyClass::test()
{
return &tryToChangeMe;
}
Run Code Online (Sandbox Code Playgroud)
在我的main函数中,然后调用上面的函数,使用auto关键字.为了测试我认为我对const的了解是正确的,然后尝试通过指针重新分配tryToChangeMe变量.像这样:
auto temp = myClass.test();
*temp = 100;
Run Code Online (Sandbox Code Playgroud)
正如我所料,由于我在尝试为const变量赋值时所引起的错误,程序无法编译.但是,我不只是返回一个指针常量,我回到一个常量指针常量(至少这是我认为我做了).所以为了测试这个,我试图将指针重新分配给一个新的内存地址,相信我会得到类似的编译错误:
temp = new int;
Run Code Online (Sandbox Code Playgroud)
但令人困惑的是,该程序编译没有任何问题.通过调试器逐步调试显示,指针正在丢失其原始地址并被分配一个全新的地址.想知道发生了什么,我偶然发现了删除auto关键字并将其替换为变量的完整类型:
const int* const temp = myClass.test();
Run Code Online (Sandbox Code Playgroud)
再次测试所有内容后,结果与预期一致,这次我无法将指针重新分配给新地址.
毕竟,我想我的问题是,为什么?为什么auto关键字允许你绕过指针的const限定符?我做错什么了吗?
顺便说一句,我不确定它是否重要,但我正在使用Visual Studio 2015预览版
在使用通用引用的同时,我遇到了clang和gcc在重载决策上不一致的情况.
#include <iostream>
struct foo {};
template<typename T>
void bar(T&) { std::cout << "void bar(T&)\n"; }
template<typename T>
void bar(T&&) { std::cout << "void bar(T&&)\n"; }
int main()
{
foo f;
bar(f); // ambiguous on gcc, ok on clang
}
Run Code Online (Sandbox Code Playgroud)
gcc报告上面的调用是模棱两可的.但是,clang选择T&重载并成功编译.
哪个编译器有问题,为什么?
编辑:
在VS2013预览中测试相同的代码,它同意clang; 除了Intellisense,这是在gcc的一方:-)
c++ overload-resolution c++11 universal-reference forwarding-reference
我遇到了关于enable_if和模板特化的适当用法的问题.
修改示例后(出于保密原因),这是一个类似的例子:
我有一个名为"less"的函数,用于检查1st arg是否小于2nd arg.假设我想根据输入的类型有两种不同的实现 - 一个是整数实现,另一个是double.
到目前为止我的代码看起来像这样 -
#include <type_traits>
#include <iostream>
template <class T,
class = typename std::enable_if<std::is_floating_point<T>::value>::type>
bool less(T a, T b) {
// ....
}
template <class T,
class = typename std::enable_if<std::is_integral<T>::value>::type>
bool less(T a, T b) {
// ....
}
int main() {
float a;
float b;
less(a,b);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
上面的代码没有编译,因为 - 它说我正在重新定义less方法.
错误是:
Z.cpp:15:19: error: template parameter redefines default argument
class = typename std::enable_if<std::is_integral<T>::value>::type>
^
Z.cpp:9:19: note: previous default template argument defined here …Run Code Online (Sandbox Code Playgroud) Boost join可用于连接一个字符串容器,可选择用分隔符字符串分隔,如下例所示:boost :: algorithm :: join的一个很好的例子
我的STL技能很弱.我想知道是否有任何方法可以为数字容器(浮点数,双打数,整数)使用相同的函数?看起来应该有一个或两个衬里来适应其他类型.
还有stl的复制功能,这里有一个很好的例子: 如何打印出矢量的内容?
但我不喜欢它如何在每个元素之后添加分隔符字符串.我想使用boost.