小编NoS*_*tAl的帖子

c ++ 0x为什么基于范围的for-loop中的"auto"变量作为值传递给循环体,而不是引用?

我有一个这样的错误,它让我想知道为什么它是这样设计的.我觉得自动的东西会更好:容器会产生引用,而不是值.例如:

int t[3]{11,22,33};
for(int& el:t2)
    el*=2;
Run Code Online (Sandbox Code Playgroud)

得到22,44,66

int t[3]{11,22,33};
    for(auto el:t2)
        el*=2;
Run Code Online (Sandbox Code Playgroud)

"什么也没做".

foreach c++11

3
推荐指数
1
解决办法
537
查看次数

可以为 .Net Monitor::Enter/Exit 实现 RAII(在 C++ CLI 中)

被迫 :( 在 C++ CLI 中工作我正在寻找一种方法来进行 RAII 锁定。我想出的是:

ref class RAIIMonitor
{
    RAIIMonitor();
    T^ t;
public:
    RAIIMonitor(T^ t_)
    {

        t=t_;
        System::Threading::Monitor::Enter(t_);
    }
    ~RAIIMonitor()
    {
        System::Threading::Monitor::Exit(t);
    }
    !RAIIMonitor()
    {
        assert(0); // you are using me wrong
    }
};
Run Code Online (Sandbox Code Playgroud)

用法:

 //begining of some method in MyRefClass
 RAIIMonitor<MyRefClass> monitor(this);    
Run Code Online (Sandbox Code Playgroud)

那么这是正确的方法,如果没有,有没有办法做到这一点,如果是,有没有办法做得更好?

c++-cli raii

3
推荐指数
1
解决办法
383
查看次数

一个聪明的编译器可以执行std :: move所做的所有事情,而不是它是语言的一部分吗?

这是一个理论上的问题,但是虽然我对std :: move有一些基本的了解,但我还是不确定它是否为语言提供了一些额外的功能,而这些功能在理论上无法通过supersmart编译器实现.我知道代码如下:

{
  std::string s1="STL";
  std::string s2(std::move(s1));
  std::cout << s1 <<std::endl;
} 
Run Code Online (Sandbox Code Playgroud)

是一种新的语义行为,而不仅仅是性能糖.:D但是我想在执行std :: move(x)之后没有人会使用var x.另外对于仅可移动的数据(std :: unique_ptr <>,std :: thread),如果声明类型是可移动的,那么编译器会自动执行移动构造和清除旧变量吗?再次,这意味着将在程序员后面生成更多的代码(例如,现在你可以计算cpyctor和movector调用,使用automagic std :: moving你不能这样做).

c++ move std c++11

3
推荐指数
1
解决办法
394
查看次数

获得std :: multiply和std :: plus的中性元素

在实现构造函数采用的模板类时:

  1. 函数向量(函数类型std::function<bool(const T&)>)
  2. std::binary_function<bool,bool,bool> 我将用于累积从1)到某个值的矢量应用的结果.

我希望能够使用std::plus()std::multiplies()作为第二个模板参数,但问题是,根据函数我需要一个相应的中性元素(对于std累积初始值).对于AND(std::multiplies)我需要true(又名1),因为OR(std::plus)我需要false(又名0).我知道我可以专门化模板并解决问题,但我想知道是否有办法为内置STL函数获取中性元素.

c++ stl template-meta-programming

3
推荐指数
1
解决办法
1062
查看次数

clang未能连接2线主功能程序

我很容易得到clang,当我尝试编译简单的2行程序时会发生这种情况:(我在机器上有g ++,IDK,如果这是问题的原因)

clang teststring.cpp -v Ubuntu clang version 3.0-6ubuntu3(tags/RELEASE_30/final)(基于LLVM 3.0)目标:i386-pc-linux-gnu线程模型:posix"/ usr/bin/clang"-cc1 -triple i386-pc-linux-gnu -emit-obj -mrelax-all -disable-free -disable-llvm-verifier -main-file-name teststring.cpp -mrelocation-model static -mdisable-fp-elim -masm-verbose - mconstructor-别名-target-CPU的Pentium4 -target链接器版本2.22 -momit叶帧指针-v -resource-DIR /usr/bin/../lib/clang/3.0 -fmodule缓存路径/无功/ tmp/clang-module-cache -internal-isystem /usr/include/c++/4.6 -internal-isystem /usr/include/c++/4.6/i686-linux-gnu -internal-isystem /usr/include/c++/4.6/backward -internal-isystem/usr/local/include -internal-isystem /usr/bin/../lib/clang/3.0/include -internal-externc-isystem/usr/include/i686-linux-gnu -internal- externc-isystem/usr/include -fdeprecated-macro -ferror-limit 19 -fmessage-length 80 -fgnu-runtime -fobjc-runtime-has-arc -fobjc-runtime-has-weak -fobjc-fragile-abi -fcxx- EXC eptions -fexceptions -fdiagnostics-show-option -fcolor-diagnostics -o /tmp/teststring-e3FNx4.o -x c ++ teststring.cpp clang -cc1 version 3.0基于llvm 3.0托管在i386-pc-linux-gnu上忽略不存在的目录"/ usr/include/i686-linux-gnu"忽略不存在的目录"/usr/include/c++/4.6//i686-linux-gnu/32"忽略不存在的目录"/ usr/include/i686-linux-gnu /"忽略不存在的目录"/ usr/include/i686-linux-gnu"忽略重复目录"/usr/include/c++/4.6"忽略重复目录"/usr/include/c++/4.6/i686-linux-gnu"忽略重复目录"/usr/include/c++/4.6/backward"忽略重复目录"/usr/include/c++/4.6"忽略重复目录"/usr/include/c++/4.6/backward"忽略重复目录"/ usr/include/c ++ /4.6"忽略重复目录'/usr/include/c++/4.6/i686-linux-gnu’忽略重复目录'/usr/include/c++/4.6/backward’忽略重复目录'的/ usr /本地/包括’忽略重复目录"/ u sr/bin …

c++ linker clang

3
推荐指数
1
解决办法
2410
查看次数

有什么方法可以告诉mercurial文件改名吗?

这是一个无聊的问题,因为我知道如何做到这一点,但关键是我希望看到有更好的方法比删除旧文件,添加新文件...我知道TortoiseHg自动检测它,但是当我使用TortoiseHg进行anonnate时,文件有一个单独的历史记录...那么有没有办法告诉mercurial这是一个重命名的文件?请注意我在这里混合一点TortoiseHg和Mercurial,我知道一个是DVCS,另一个是GUI.

mercurial tortoisehg

3
推荐指数
1
解决办法
83
查看次数

有没有办法选择我想要分配的一个实例的成员而无需手动分配它们

我假设我有Class C成员x,y,z,t,u,v

C c1,c2;
//... 
c1.x = c2.x;
c1.u = c2.u;
c1.v = c2.v;
Run Code Online (Sandbox Code Playgroud)

这段代码可以压缩,以便我可以列出x, u, v吗?

编辑:动机是我有一个更新的类,但一些值不再计算,因为它们保持不变.

c++ class

3
推荐指数
1
解决办法
98
查看次数

设定差的输出可以存储在第一个输入中吗?

如果我有2个向量(或双端队列):

我可以将它们的set_difference存储在第一个向量中吗?

再次从cpp Wiki参考中得到以下示例:

std::vector<int> v1 {1, 2, 5, 5, 5, 9};
std::vector<int> v2 {2, 5, 7};
std::vector<int> diff;

std::set_difference(v1.begin(), v1.end(), v2.begin(), v2.end(), 
                    std::inserter(diff, diff.begin()));
Run Code Online (Sandbox Code Playgroud)

如果将其更改为:

std::vector<int> v1 {1, 2, 5, 5, 5, 9};
std::vector<int> v2 {2, 5, 7};

std::set_difference(v1.begin(), v1.end(), v2.begin(), v2.end(), 
                    v1.begin());
Run Code Online (Sandbox Code Playgroud)

注意,第一个输入表示我是第一个向量,是的,我知道STL适用于范围,而不适用于容器。

c++ stl c++11

3
推荐指数
1
解决办法
355
查看次数

什么可以在NaN情况下返回to_string()

我使用VS 2012,我遇到了非常恼人的行为(有时我的浮动是NaN):

auto dbgHelp = std::to_string(myFloat);
Run Code Online (Sandbox Code Playgroud)

dbgHelp最终包含5008个字符(你不能发明这些东西)大部分都是0,它最终得到:0.#INF00

那么这个bug或标准是否允许像这样的白痴返回值?

修复是微不足道的,因为我可以用三元运算符来制作正确的thig,isnan() 但我想知道标准是否具体对此...

c++ visual-c++ c++11

3
推荐指数
1
解决办法
648
查看次数

从变体<C,B>中分配变体<A,B,C>?

使用=不起作用.

我有这样的代码,但它有点"难".

#include <iostream>
#include <cassert>
#include <variant>
#include <string>

using namespace std;

namespace detail {
    template<typename... L, typename... R>
    void VariantAssignRec(variant<L...>* lhs, const variant<R...>&rhs, size_t rhs_idx, std::integral_constant<int, -1>) {
    }

    template<typename... L, typename... R, int get_idx>
    void VariantAssignRec(variant<L...>* lhs, const variant<R...>&rhs, size_t rhs_idx, std::integral_constant<int, get_idx> = {}) {
        assert(rhs_idx < std::variant_size_v< variant<R...>>);
        if (get_idx == rhs_idx) {
            cout << "assigning from idx " << get_idx << endl;
            *lhs = std::get<get_idx>(rhs);
            return;
        }
        else {
            std::integral_constant<int, get_idx - …
Run Code Online (Sandbox Code Playgroud)

c++ boost-variant c++17

3
推荐指数
1
解决办法
131
查看次数