小编Pra*_*ian的帖子

如何使用stringstream格式化十六进制数字

我试图将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.我该如何解决?

c++ hex stringstream string-formatting c++11

21
推荐指数
1
解决办法
4万
查看次数

捕捉这个词在lambdas的背景下意味着什么?

有人可以提供一些见解吗?lambda是捕获外部变量,还是外部世界捕获lambda产生的值?捕获某个变量意味着什么?

c++ lambda c++11

21
推荐指数
2
解决办法
1464
查看次数

C++ 11私有默认构造函数

以下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;吗?

c++ gcc default-constructor c++11 gcc4.8

20
推荐指数
1
解决办法
2044
查看次数

C++ 11:在迭代时从std :: unordered_map中删除单个元素是否安全?

考虑在迭代时从关联容器中删除元素的规范算法:

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在迭代期间删除一个元素,我是否必须担心一些元素会被访问多次或根本不访问?

c++ iterator stl unordered-map c++11

19
推荐指数
1
解决办法
1780
查看次数

为什么std :: get for variant抛出失败而不是未定义的行为?

根据投掷的cppreference std::get,如果包含的类型不是预期的类型.这意味着标准库必须检查每次访问(libc ++).variantstd::bad_variant_accessvariant

这个决定的理由是什么?为什么它不是未定义的行为,就像C++中的其他地方一样?我可以解决吗?

c++ variant c++17

19
推荐指数
3
解决办法
949
查看次数

函数的引用限定符是否有任何实际用例?

最近我了解到function's reference qualifiers,例如

struct foo
{
    void bar() {}
    void bar1() & {}
    void bar2() && {}
};
Run Code Online (Sandbox Code Playgroud)

我可能需要此功能的地方,这个语言功能是否有任何实际用例?

c++ c++11 ref-qualifier c++14

18
推荐指数
2
解决办法
1245
查看次数

返回const指针指向const数据成员和'auto'关键字.有点困惑

我最近一直在学习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预览版

c++ pointers const auto c++11

18
推荐指数
2
解决办法
2883
查看次数

左值参数是否比通用引用更喜欢左值引用参数?

在使用通用引用的同时,我遇到了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

17
推荐指数
1
解决办法
360
查看次数

模板特化和enable_if问题

我遇到了关于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)

c++ templates sfinae enable-if c++11

17
推荐指数
1
解决办法
5886
查看次数

可以提升:algorithm :: join()concat容器的浮点数?

Boost join可用于连接一个字符串容器,可选择用分隔符字符串分隔,如下例所示:boost :: algorithm :: join的一个很好的例子

我的STL技能很弱.我想知道是否有任何方法可以为数字容器(浮点数,双打数,整数)使用相同的函数?看起来应该有一个或两个衬里来适应其他类型.

还有stl的复制功能,这里有一个很好的例子: 如何打印出矢量的内容?

但我不喜欢它如何在每个元素之后添加分隔符字符串.我想使用boost.

c++ string boost stl adapter

16
推荐指数
1
解决办法
6575
查看次数