我有一个这样的错误,它让我想知道为什么它是这样设计的.我觉得自动的东西会更好:容器会产生引用,而不是值.例如:
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)
"什么也没做".
被迫 :( 在 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)
那么这是正确的方法,如果没有,有没有办法做到这一点,如果是,有没有办法做得更好?
这是一个理论上的问题,但是虽然我对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你不能这样做).
在实现构造函数采用的模板类时:
std::function<bool(const T&)>)std::binary_function<bool,bool,bool> 我将用于累积从1)到某个值的矢量应用的结果.我希望能够使用std::plus()和std::multiplies()作为第二个模板参数,但问题是,根据函数我需要一个相应的中性元素(对于std累积初始值).对于AND(std::multiplies)我需要true(又名1),因为OR(std::plus)我需要false(又名0).我知道我可以专门化模板并解决问题,但我想知道是否有办法为内置STL函数获取中性元素.
我很容易得到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 …
这是一个无聊的问题,因为我知道如何做到这一点,但关键是我希望看到有更好的方法比删除旧文件,添加新文件...我知道TortoiseHg自动检测它,但是当我使用TortoiseHg进行anonnate时,文件有一个单独的历史记录...那么有没有办法告诉mercurial这是一个重命名的文件?请注意我在这里混合一点TortoiseHg和Mercurial,我知道一个是DVCS,另一个是GUI.
我假设我有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吗?
编辑:动机是我有一个更新的类,但一些值不再计算,因为它们保持不变.
如果我有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适用于范围,而不适用于容器。
我使用VS 2012,我遇到了非常恼人的行为(有时我的浮动是NaN):
auto dbgHelp = std::to_string(myFloat);
Run Code Online (Sandbox Code Playgroud)
dbgHelp最终包含5008个字符(你不能发明这些东西)大部分都是0,它最终得到:0.#INF00
那么这个bug或标准是否允许像这样的白痴返回值?
修复是微不足道的,因为我可以用三元运算符来制作正确的thig,isnan()
但我想知道标准是否具体对此...
使用=不起作用.
我有这样的代码,但它有点"难".
#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)