我在网上发现了一些如下信息,但不完整.
http://en.wikipedia.org/wiki/Input/output_base_address
http://wiki.osdev.org/I/O_Ports
在哪里下载规范?
以下代码在C++中是否合法?
void f(void* = 0)
{}
int main()
{
f();
}
Run Code Online (Sandbox Code Playgroud)
C++标准的哪一页说明这种用法是合法的?
在Visual Studio中,F5用于StartDebugging和Continue,这很烦人.因为许多其他IDE /调试器不以相同的方式起作用,例如cgdb,IntelliJ IDEA.
为了简单和通用,我想对所有IDE /调试器使用一种密钥绑定方案.我不能改变其他的IDE /调试器结合两者的StartDebugging并继续到F5.
所以,我的问题是:
有没有办法在Visual Studio中单独绑定StartDebugging和Continue到不同的键?
int main()
{
short n1 = 8ll; // no warning
// warning C4305: 'initializing': truncation from '__int64' to 'short'
// warning C4309: 'initializing': truncation of constant value
short n2 = 88888ll;
}
Run Code Online (Sandbox Code Playgroud)
我的编译器是Visual Studio 2017.
根据cppref:
整数文字的类型是值可以适合的第一种类型,从类型列表中取决于使用哪个数字基数和哪个整数后缀.
带后缀的整数文字ll应为long long int; 所以short n1 = 8ll应该触发像short n2 = 88888ll这样的警告.
如果C++ short int足够小,C++是否允许将任何整数文字隐式转换为a ?
#include <vector>
#include <iostream>
#include <range/v3/all.hpp>
int main()
{
auto coll = std::vector{ 1, 2, 3 };
ranges::copy(
coll,
ranges::ostream_iterator<int>{ std::cout, ", " }
); // ok
ranges::copy(
coll,
std::ostream_iterator<int>{ std::cout, ", " }
); // error
}
Run Code Online (Sandbox Code Playgroud)
问题显示在上面的代码中.我使用range-v3-0.3.7.
对我来说,通用算法copy不应该关心目标迭代器类型,只要它满足输出迭代器的要求即可.
如果是这样,为什么范围的算法不与std的迭代器兼容?
在当前的C++中,类ostream_iterator的设计如下:
// excerpted from the standard C++
template<class T, ...>
class ostream_iterator
{
public:
ostream_iterator(ostream_type&);
...
ostream_iterator<T,...>& operator =(const T&);
...
};
Run Code Online (Sandbox Code Playgroud)
对我来说,这种设计并不是最理想的.因为用户在声明ostream_iterator时必须指定类型T:ostream_iterator<int> oi(cout);事实上,cout可以将任何类型的对象作为其参数,而不是仅使用一种类型.这是一个明显的限制.
// Below is my own version
// doesn't need any template parameter here
class ostream_iterator
{
public:
ostream_iterator(ostream_type&);
...
// define a template member function which can take any type of argument and output it
template<class T>
ostream_iterator<T,...>& operator =(const T&);
...
};
Run Code Online (Sandbox Code Playgroud)
现在,我们可以使用它如下:
ostream_iterator oi(cout);
Run Code Online (Sandbox Code Playgroud)
我认为它比它更通用,更优雅
ostream_iterator<int> oi(cout);
Run Code Online (Sandbox Code Playgroud)
我对吗?
template<class T>
struct is_iterator
{
static const bool value = ??? // What to write ???
};
int main()
{
assert(false == is_iterator<int>::value);
assert(true == is_iterator<vector<int>::iterator>::value);
assert(true == is_iterator<list<int>::iterator>::value);
assert(true == is_iterator<string::iterator>::value);
assert(true == is_iterator<char*>::value); // a raw pointer is also an iterator
}
Run Code Online (Sandbox Code Playgroud)
问题是:如何使五个断言语句通过?
不用说以下代码:
#include <utility>
#include <vector>
#include <iostream>
#include <iterator>
using namespace std;
typedef pair<char, char> PAIR;
ostream& operator <<(ostream& os, const PAIR& r)
{
return os << r.first;
}
int main()
{
vector<PAIR> coll;
cout << coll[0]; // OK.
// The following line will cause a compilation error! Why???
copy(coll.begin(), coll.end(), ostream_iterator<PAIR>(cout));
}
Run Code Online (Sandbox Code Playgroud) #include <new>
using namespace std;
void f(void*)
{}
struct A
{};
int main()
{
A a;
f((a.~A(), &a)); // OK
new (&a) A(); // OK
new ((a.~A(), &a)) A(); // error C2059: syntax error : 'type'
}
Run Code Online (Sandbox Code Playgroud)
我认为(a.~A(),&a)是一个有效的表达式,可以计算为指针值,因此它应该被接受为放置参数,为什么结果不是这样?
我的编译器是VC++ 2013 RC.这是编译器错误吗?
更新:
我已经向connect.microsoft.com提交了一个错误
public class Main {
public static <T> void foo(T[] bar) {
double d = (double) bar[0]; // Error : incompatible types
}
public static void main(String[] args) {
int[] int_buf = new int[8];
foo(int_buf);
}
}
Run Code Online (Sandbox Code Playgroud)
问题在代码中指出.
为什么Java泛型不允许对泛型类型进行类型转换?