小编vol*_*evo的帖子

为什么boost可选参考不是T*的包装?

既然boost::optional<T&>已经是专业化了,为什么它不仅仅被实现为包装T*?这将允许它占用更少的空间,因为不需要m_initialized布尔值.

c++ memory boost pointers reference

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

C++如何处理const double并引用int?

我今天早上正在研究一些模板代码,我用它BOOST_STATIC_ASSERT来确保我没有创建错误类型的引用,因为我认为这可能是一个更清晰的错误消息.但是,当我尝试删除静态断言以查看替代编译器错误时,我惊讶地发现,当您尝试使const为double并引用int时,gcc甚至不会抱怨:

#include <iostream>

int main()
{
    int x = 5;
    const double& y = x;
    std::cout << y << std::endl;

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

编译,甚至不警告:

$ g++ ~/stuff/badRef.cpp -Wall -Wextra -pedantic
$ a.out
5
Run Code Online (Sandbox Code Playgroud)

这里发生了什么?这是未定义的行为吗?如果是这样,为什么gcc不抱怨?在我的机器上int是4个字节而double是8.这意味着当打印double时它应该将该地址的8个字节解释为double并打印它,但实际上在该位置有4个字节的int.

非常困惑.救命!

c++ reference

17
推荐指数
2
解决办法
2869
查看次数

在C++中,使用std :: min或if分支限制值是否更好?

编程中一种非常常见的模式是在某种更新后将值限制在最大值.我想知道的是,如果以下两段代码之间存在差异,并且是否应该首选:

value += increment;
value = std::min(value, valueMax);
Run Code Online (Sandbox Code Playgroud)

VS

value += increment;

if (value > valueMax)
    value = valueMax;
Run Code Online (Sandbox Code Playgroud)

我的想法是,这取决于CPU是否有获取两个值并产生最小值的指令.如果是这样,对std :: min的调用应该导致该指令并避免不必要的分支.如果不是,则第二个版本在值<= valueMax时避免不必要的赋值.

我对这种事情不是很了解,但我确信有老派的黑客大佬会知道这一点.我问他们:哪个更好?

c++ cpu instruction-set minimum

16
推荐指数
2
解决办法
3612
查看次数

在GNOME终端中,Vim背景颜色无法正确呈现

Vim背景问题

我猜很多人都会遇到这个问题,但我似乎无法在任何地方找到任何其他线程/问题.我想在关键词中捕捉很难.

基本上,当在没有文本的地方向上滚动时,Vim不会绘制背景颜色.我也在朋友的Mac上看过它,所以我的设置并不特别.

我有一个非常大的vimrc,但是在没有vimrc和设置:colorscheme蓝色的情况下我遇到了同样的问题.

我在Ubuntu 11.10(Oneiric Ocelot)上使用gnome-terminal .这是我几天前设置的一个相当干净的安装,所以没有任何有趣的业务正在进行.我希望这可以开箱即用.

我在其他环境中没有遇到过这个问题,例如通过SSHPuTTY或以前版本的Ubuntu,我猜测它也是gnome-terminal.

这是怎么回事?

vim scroll background gnome-terminal

12
推荐指数
1
解决办法
2038
查看次数

创建仅限专业化功能模板的最佳方法是什么?

有没有更好的方法来做到以下几点?

#include <iostream>

template <typename T>
T Bar();

template <>
int Bar<int>() { return 3; }

// Potentially other specialisations

int main()
{
    std::cout << Bar<int>() << std::endl; // This should work
    std::cout << Bar<float>() << std::endl; // This should fail
}
Run Code Online (Sandbox Code Playgroud)

该解决方案的问题在于它(可理解地)链接时间与"未定义的浮点引用Bar<float>()"等失败.这可能会让其他开发人员感到困惑,因为他们可能怀疑实现文件没有被链接.

我知道另一种可能的解决方案:

template <typename T>
T Bar() { BOOST_STATIC_ASSERT(sizeof(T) == 0); }
Run Code Online (Sandbox Code Playgroud)

这会在Bar<float>()请求时导致编译器错误,正是我想要的.但是,我担心技术上编译器可能会拒绝这一点,就像gcc拒绝一样,BOOST_STATIC_ASSERT(false)因为它知道无论模板参数如何都会失败,因为sizeof(T)永远不会为零.

总之,我想知道是否:

  1. 还有另一种方法可以做到这一点.
  2. 我错了,BOOST_STATIC_ASSERT(sizeof(T))实际上没有实例化也不会失败.
  3. 唯一的方法是让它成为上面的链接器错误.

c++ templates boost template-specialization

9
推荐指数
2
解决办法
239
查看次数

为什么boost :: equals要求范围可以复制?

不能为我的生活理解为什么这会失败:

#include <vector>

#include "boost/algorithm/string/predicate.hpp"

struct Test
:
    public std::vector<int>
{
    Test() { }
    Test(const Test&) { assert(false); }
};

int main()
{
    Test a;
    Test b;
    boost::algorithm::equals(a, b);

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

输出:

$ g++ boostEqualsCopyDemo.cpp -I /usr/include/boost-1_47
$ a.out
a.out: boostEqualsCopyDemo.cpp:10: Test::Test(const Test&): Assertion `false' failed.
Aborted (core dumped)
Run Code Online (Sandbox Code Playgroud)

我已经尝试过挖掘增强代码,但这让我头晕目眩.这似乎很荒谬; 如此浪费和不必要.这是怎么回事?

c++ algorithm boost equals range

7
推荐指数
1
解决办法
1080
查看次数

为什么C++允许但忽略const对函数类型的应用?

我真正开始探索C++的不寻常角落.从这个问题中了解了函数的真实类型而不是函数指针,我尝试了解函数类型,并提出了这个奇怪的案例:

typedef int Func(int);

int Foo(int x) { return 1; }

int main()
{
    const Func*& f = &Foo;

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

既然&Foo是一个rvalue类型Func*,我想我应该能够把它放在一个const引用中,但是我从g ++ 4.6中得到了这个错误:

funcTypes.cpp: In function ‘int main()’:
funcTypes.cpp:7:23: error: invalid initialization of non-const reference of type ‘int (*&)(int)’ from an rvalue of type ‘int (*)(int)’
Run Code Online (Sandbox Code Playgroud)

但是f 常量!对我来说很明显,简单地忽略了const对函数(或对指针等的引用/引用)的应用; 这段代码编译得很好:

template <typename A, typename B>
struct SameType;

template <typename A>
struct SameType<A, A> { };

typedef int Func(int);

int main()
{ …
Run Code Online (Sandbox Code Playgroud)

c++ templates types metaprogramming function

6
推荐指数
1
解决办法
674
查看次数

是否可以使用命令行选项指定bash提示符?

我经常使用vim,并且经常发现使用它进入命令行非常有用!bash.但是,我需要键入exit以返回到vim,有时我不确定我是否在子shell中或者是否会关闭我的会话.

我真正想要做的是输入类似的东西!bash -prompt "subshell",我得到这样的东西:

subshell$ <commands go here>
Run Code Online (Sandbox Code Playgroud)

这可能吗?

vim bash command-line

5
推荐指数
2
解决办法
1203
查看次数