既然boost::optional<T&>
已经是专业化了,为什么它不仅仅被实现为包装T*
?这将允许它占用更少的空间,因为不需要m_initialized
布尔值.
我今天早上正在研究一些模板代码,我用它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.
非常困惑.救命!
编程中一种非常常见的模式是在某种更新后将值限制在最大值.我想知道的是,如果以下两段代码之间存在差异,并且是否应该首选:
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时避免不必要的赋值.
我对这种事情不是很了解,但我确信有老派的黑客大佬会知道这一点.我问他们:哪个更好?
我猜很多人都会遇到这个问题,但我似乎无法在任何地方找到任何其他线程/问题.我想在关键词中捕捉很难.
基本上,当在没有文本的地方向上滚动时,Vim不会绘制背景颜色.我也在朋友的Mac上看过它,所以我的设置并不特别.
我有一个非常大的vimrc,但是在没有vimrc和设置:colorscheme
蓝色的情况下我遇到了同样的问题.
我在Ubuntu 11.10(Oneiric Ocelot)上使用gnome-terminal .这是我几天前设置的一个相当干净的安装,所以没有任何有趣的业务正在进行.我希望这可以开箱即用.
我在其他环境中没有遇到过这个问题,例如通过SSH与PuTTY或以前版本的Ubuntu,我猜测它也是gnome-terminal.
这是怎么回事?
有没有更好的方法来做到以下几点?
#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)
它永远不会为零.
总之,我想知道是否:
BOOST_STATIC_ASSERT(sizeof(T))
实际上没有实例化也不会失败.不能为我的生活理解为什么这会失败:
#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++的不寻常角落.从这个问题中了解了函数的真实类型而不是函数指针,我尝试了解函数类型,并提出了这个奇怪的案例:
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) 我经常使用vim,并且经常发现使用它进入命令行非常有用!bash
.但是,我需要键入exit
以返回到vim,有时我不确定我是否在子shell中或者是否会关闭我的会话.
我真正想要做的是输入类似的东西!bash -prompt "subshell"
,我得到这样的东西:
subshell$ <commands go here>
Run Code Online (Sandbox Code Playgroud)
这可能吗?