可能的重复:
为什么Java没有条件和条件运算符的复合赋值版本?(&& =,|| =)
为什么"&& ="运算符不存在?
今天在工作中我写了以下LOC(b和b1的真实身份是保密:)
b &&= b1; // meaning b = b && b1;
Run Code Online (Sandbox Code Playgroud)
我盯着它看了几秒钟,发现没有这样的操作员.只是为了确定,我点击了编译,但失败了.为了确定我已经咨询了标准.
是否存在没有此类运营商的具体原因?我能想到一些:
b &&= b1和b = b && b1因为&&的短路评价的可能不等同.我并不认为拥有这样的运营商是非常有用的,不.我也没有声称上述三个原因中的任何一个或全部都不足以避免创建该运营商.我的问题如下:是否有一个更严重的原因我要监督?
C++03 3.6.1.3:函数main不得在程序中使用(3.2)....
我想知道为什么这个规则存在...是否有人知道任何系统/实现,如果使用main,它将是一个问题?
PS 1.我知道该术语的定义used.2.我知道有一些简单的解决方法,比如从main()调用单个MyMain()并使用MyMain()代替.3.问题是关于现实世界的实施,如果不存在限制则会产生问题.谢谢!
你如何在一次通过或不通过两次通过的情况下在链表中选择一个未知长度的统一随机元素?
我有这样的事情:
#include <iostream>
namespace N
{
typedef std::pair<int, double> MyPair;
std::ostream& operator << (std::ostream& o, MyPair const & mypair)
{
///
}
}
int main()
{
N::MyPair pr;
std::cout << pr;
}
Run Code Online (Sandbox Code Playgroud)
这自然不起作用,因为ADL找不到operator<<因为namespace N与MyPair(不幸)相关联.Afaik可能不会添加到命名空间std,所以如果我选择operator <<在std中定义那将是非法的.那么......在这种情况下该怎么办?我不想明确限定operator <<,也不想写using namespace N.所以,问题是:
考虑以下程序:
#include <iostream>
#include <iterator>
#include <vector>
#include <utility>
using namespace std; //just for convenience, illustration only
typedef pair<int, int> point; //this is my specialization of pair. I call it point
istream& operator >> (istream & in, point & p)
{
return in >> p.first >> p.second;
}
int main()
{
vector<point> v((istream_iterator<point>(cin)), istream_iterator<point>());
// ^^^ ^^^
//extra parentheses lest this should be mistaken for a function declaration
}
Run Code Online (Sandbox Code Playgroud)
这无法编译,因为只要ADL在命名空间std中找到operator >>,它就不再考虑全局范围,无论在std中找到的运算符是否是可行的候选者.这很不方便.如果我将operator >>的声明放入命名空间std(这在技术上是非法的),代码编译得很好.除了创建point我自己的类而不是将其定义为std命名空间中模板的特化之外,有没有办法解决这个问题?
提前致谢
使用布尔值的向量比动态位集慢吗?
我刚刚听说过boost的动态bitset,我想知道它值得麻烦.我可以只使用布尔值的向量吗?
假设我有两个翻译单元:
//A.cpp
class X
{
};
//B.cpp
class X
{
int i;
};
Run Code Online (Sandbox Code Playgroud)
上面的程序是否格式良好?
如果没有,没有进一步的问题。如果答案是肯定的,程序是良构的(忽略 main 的缺失),那么第二个问题。如果其中有一个同名的函数怎么办?
//A.cpp
class X
{
void f(){}
};
//B.cpp
class X
{
int i;
void f(){}
};
Run Code Online (Sandbox Code Playgroud)
这对链接器来说会不会是一个问题,因为它会在两个目标文件中看到 &X::f ?在这种情况下必须使用匿名命名空间吗?
这个问题一直困扰着我一段时间.让我们考虑以下两个程序:
#incude <iostream>
int main()
{
std::cout << "Hello, World!";
}
Run Code Online (Sandbox Code Playgroud)
和
int main()
{
int x = 5;
int y = x*x;
}
Run Code Online (Sandbox Code Playgroud)
我知道这取决于编译器和操作系统,但我需要一般答案或特定的例子.TIA.
例如,我可以使用std::ostream十六进制的对象输出整数
std::cout << std::hex << 0xabc; //prints `abc`, not the base-10 representation
Run Code Online (Sandbox Code Playgroud)
所有基地都有通用的操纵器吗?就像是
std::cout << std::base(4) << 20; //I want this to output 110
Run Code Online (Sandbox Code Playgroud)
如果有,那我就没有其他问题了.如果没有,那我可以写一个吗?它不会要求我访问私人实施细节std::ostream吗?
请注意,我知道我可以编写一个带有数字的函数,并将其转换为字符串,该字符串是任何基数中该数字的表示.或者我可以使用已经存在的.我问的是自定义流操纵器 - 它们可能吗?
提前致谢
我不时感觉需要某种迭代器(除了前面这个问题的标题之外,我不能说出一个好名字).
假设我们有一个函数(或函数对象)将整数映射到类型T.也就是说,我们有一个数学序列的定义,但我们实际上并没有将它存储在内存中.我想用它做一个迭代器.迭代器类看起来像这样:
template <class F, class T>
class sequence_iterator : public std::iterator<...>
{
int i;
F f;
public:
sequence_iterator (F f, int i = 0):f(f), i(i){}
//operators ==, ++, +, -, etc. will compare, increment, etc. the value of i.
T operator*() const
{
return f(i);
}
};
template <class T, class F>
sequence_iterator<F, T> make_sequence_iterator(F f, int i)
{
return sequence_iterator<F, T>(f, i);
}
Run Code Online (Sandbox Code Playgroud)
也许我天真,但我个人觉得这个迭代器会非常有用.例如,假设我有一个函数来检查数字是否为素数.我想计算区间[a,b]中素数的数量.我会这样做;
int identity(int i)
{
return i;
}
count_if(make_sequence_iterator<int>(identity, a), make_sequence_iterator<int>(identity, b), isPrime); …Run Code Online (Sandbox Code Playgroud)