我正在玩SFINAE并发现我无法解释的行为.
这编译正常:
template<typename Integer,
std::enable_if_t<std::is_integral<Integer>::value>* = nullptr>
void foo(Integer) {}
template<typename Floating,
std::enable_if_t<std::is_floating_point<Floating>::value>* = nullptr>
void foo(Floating) {}
Run Code Online (Sandbox Code Playgroud)
虽然这个(nullptr替换为0):
template<typename Integer,
std::enable_if_t<std::is_integral<Integer>::value>* = 0>
void foo(Integer) {}
template<typename Floating,
std::enable_if_t<std::is_floating_point<Floating>::value>* = 0>
void foo(Floating) {}
Run Code Online (Sandbox Code Playgroud)
prog.cpp: In function ‘int main()’: prog.cpp:13:10: error: no matching function for call to ‘foo(int)’
foo(3);
^ prog.cpp:5:6: note: candidate: template<class Integer, std::enable_if_t<std::is_integral<_Tp>::value>* <anonymous> > void foo(Integer) void foo(Integer) {}
^~~ prog.cpp:5:6: note: template argument deduction/substitution failed: prog.cpp:4:64: …Run Code Online (Sandbox Code Playgroud) 只是确保它确实是一个错误,而不是我可能误解了std :: quoted的功能
这个代码在我看来应该用双引号转义双引号,然后将它们转换回原始字符串:
#include <iostream>
#include <iomanip>
#include <string>
#include <sstream>
int main()
{
std::string s = R"(something"something)";
std::cout << "Original: \t" << s << std::endl;
std::ostringstream oss;
oss << std::quoted(s, '"', '"');
std::string s1 = oss.str();
std::cout << "Quoted: \t" << s1 << std::endl;
std::istringstream iss(s1);
std::string s2;
iss >> std::quoted(s2, '"', '"');
std::cout << "Unquoted: \t" << s2 << std::endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
预期产量:
Original: something"something
Quoted: "something""something"
Unquoted: something"something
Run Code Online (Sandbox Code Playgroud)
然而,这是我在VS2017 15.6.6中得到的:
Original: something"something
Quoted: …Run Code Online (Sandbox Code Playgroud) 在这个问题的评论和答案中:
虚函数编译器优化c ++
认为循环中的虚函数调用不能被虚拟化,因为虚函数可能this被另一个使用placement new的对象替换,例如:
void A::foo() { // virtual
static_assert(sizeof(A) == sizeof(Derived));
new(this) Derived;
}
Run Code Online (Sandbox Code Playgroud)
该示例来自LLVM博客关于虚拟化的文章
现在我的问题是:标准允许的是什么?
我可以在关于存储重用的cppreference上找到这个:(强调我的)
如果对象是可以破坏的,或者如果程序不依赖于析构函数的副作用,则不需要程序调用对象的析构函数来结束其生命周期.但是,如果一个程序结束了一个非平凡对象的生命周期,它必须确保在隐式调用析构函数之前就地构造一个相同类型的新对象(例如,通过放置new).
如果新对象必须具有相同的类型,则它必须具有相同的虚函数.因此,不可能有不同的虚函数,因此,虚拟化是可以接受的.
或者我误解了什么?
假设我想创建一个std::unique_ptr<int[]>,但我想将创建的数组初始化为自定义值:{1,2,3,4,5}。
我可以使用new原始指针并将其传递给std::unique_ptr构造函数,然后构造函数将拥有并管理它。
std::unique_ptr<int[]> ptr{ new int[5]{1,2,3,4,5} };
Run Code Online (Sandbox Code Playgroud)
我的问题是,可以以某种方式完成同样的事情std::make_unique吗?
假设我们有一个2D int数组:
int a[3][4] = { { 1,3,2,4 }, { 2,1,5,3 }, { 0,8,2,3 } };
Run Code Online (Sandbox Code Playgroud)
获取其地址并将其重新解释为指向1D数组的指针是合法有效int的吗?基本上:
int *p = reinterpret_cast<int *>(&a);
Run Code Online (Sandbox Code Playgroud)
所以我可以做(粗略地):
template<typename T, size_t X, size_t Y>
void sort2(T(&arr)[X][Y])
{
T *p = reinterpret_cast<T *>(&arr);
std::sort(p, p + X*Y);
}
Run Code Online (Sandbox Code Playgroud)
据我所知,该标准保证2D阵列的对齐在内存中是连续的,虽然p + X*Y技术上超出范围从不被访问,因此也不应导致未定义的行为.
我可以在需要时将2D阵列绝对视为一维阵列吗?
从C++ 11开始,std::shuffle()对随机位生成器进行右值引用:
template<class RandomIt, class URBG>
void shuffle(RandomIt first, RandomIt last, URBG&& g);
Run Code Online (Sandbox Code Playgroud)
所以我可以这么称呼它:
std::vector<int> v = {...};
std::random_device rd;
std::mt19937 g(rd());
std::shuffle(v.begin(), v.end(), g);
Run Code Online (Sandbox Code Playgroud)
这揭示了我对C++的理解错误,我今天早上通过阅读无法满足:在这里使用右值引用可以获得什么?换句话说,为什么不这样做
template<class RandomIt, class URBG>
void shuffle(RandomIt first, RandomIt last, URBG& g);
Run Code Online (Sandbox Code Playgroud) 我最近从移动构造函数中偶然发现了一些奇怪的行为(从我的观点来看很奇怪).使用GCC和Visual Studio进行编译时,结果会有所不同.我想听听这种行为的解释,不要认为这是一个bug,但可能是特定于编译器的.
请考虑以下代码:
#include <iostream>
#include <unordered_map>
struct Test
{
std::unordered_map<int, int> v;
std::unordered_map<int, int>::iterator vend;
Test(std::unordered_map<int, int>::iterator &it)
: vend { v.end() }
{
it = this->vend;
};
Test() = delete;
Test(Test const &) = delete;
Test(Test &&) = default; // <- line in question
};
int main()
{
std::unordered_map<int, int>::iterator it;
std::unordered_map<int, Test> m;
m.emplace(0, Test{ it });
std::cout << std::boolalpha << (m.at(0).v.end() == it) << "\n";
return 0;
}
Run Code Online (Sandbox Code Playgroud)
所以我在创建元素时将迭代器存储到map元素中的map的末尾.我也参考了它以便稍后进行比较.来自std :: unordered_map :: emplace:
如果容器中没有带键的元素,则使用给定的args将新元素插入到就地构造的容器中. …
请考虑这段代码:
#include <iostream>
int main()
{
struct A
{
int x;
int y;
int z;
int foo()
{
std::cout << "enter foo: " << this->x << "," << this->y << "," << this->z << std::endl;
return 5;
}
int moo()
{
std::cout << "enter moo: " << this->x << "," << this->y << "," << this->z << std::endl;
this->x = 1;
this->z = 10;
return 2;
}
};
A b { b.foo(), b.z = b.moo(), 3};
std::cout << "final: " …Run Code Online (Sandbox Code Playgroud) c++ struct object-lifetime language-lawyer list-initialization
我正在尝试旋转向量中的每个第n个元素.我知道c ++中有一个旋转函数但是我如何旋转每个第n个元素?
例如:
([71 65 74 88 63 100 45 35 67 11])-->[65 74 88 71 100 45 35 63 11 67]
Run Code Online (Sandbox Code Playgroud)
对于上面的例子,如果n = 4那么旋转应该在每个第4个元素处发生.
1st-->([71 65 74 88])-->([65 74 88 71])
2nd-->([63 100 45 35])-->([100 45 35 63])
3rd-->([67 11])-->([11 67])
Run Code Online (Sandbox Code Playgroud) 所以我尝试比较我从它得到的迭代器值 - >第二个用int来从值的基础上从map获取键.我有这个代码:
std::map<string, std::vector<int> >::const_iterator it;
void getStudentByGrade(int gradeComp)
{
for (it = studMap.begin(); it != studMap.end(); it++)
{
if (it->second == gradeComp)
{
cout << it->first;
}
}
}
Run Code Online (Sandbox Code Playgroud)
并在if语句中我得到错误,但我比较两个整数不是吗?作为gradeComp传递的int和it-> second.
错误是:
严重级代码描述项目文件行抑制状态错误C2678二进制'==':找不到运算符,它接受类型为'const std :: vector>'的左操作数(或者没有可接受的转换)
如何解决错误?我找到了仅使用迭代器获取key值的示例.
所以这样做很诱人:
char buf[1024] = "this is";
std::sprintf(buf, "%s test", buf);
Run Code Online (Sandbox Code Playgroud)
但这是未定义的行为。我想它可以通过临时解决:
char buf[1024] = "this is";
std::sprintf(buf, "%s test", std::string(buf).c_str());
Run Code Online (Sandbox Code Playgroud)
这种方法的缺点是什么?
请考虑以下代码:
#include <iostream>
#include <unordered_set>
struct MyStruct
{
int x, y;
double mutable z;
MyStruct(int x, int y)
: x{ x }, y{ y }, z{ 0.0 }
{
}
};
struct MyStructHash
{
inline size_t operator()(MyStruct const &s) const
{
size_t ret = s.x;
ret *= 2654435761U;
return ret ^ s.y;
}
};
struct MyStructEqual
{
inline bool operator()(MyStruct const &s1, MyStruct const &s2) const
{
return s1.x == s2.x && s1.y == s2.y;
}
};
int …Run Code Online (Sandbox Code Playgroud) 我找不到职能的全名(扩展有意义的名字)printf(),scanf(),seekg().
这些人似乎在下面▼
的printf
scanf函数
seekg
你能说出这些名字的来源,或者它们是什么意思吗?