下面的代码中,为什么模板函数的显式扩展foo
无法编译,而 的扩展却bar
编译成功?实时链接 - https://godbolt.org/z/o8Ea49KEb
template <typename T1, typename T2>\nT1 foo(T2) { T2(42); return T1{}; };\n\ntemplate <typename T1, typename T2>\nT1 bar(void) { T2(42); return T1{}; };\n\nint main()\n{\n foo<int, void>(); // fails\n\n bar<int, void>(); // works\n}\n
Run Code Online (Sandbox Code Playgroud)\nT2
请注意,两个函数的主体中都使用了模板参数,唯一的区别是函数参数 tobar
已被手动替换。
这个问题是在阅读std::conditional - Invalid argument type \xe2\x80\x98void\xe2\x80\x99 即使在测试 \'void\'并试图简化问题时受到启发的。
\n我正在尝试定义部分专门化的类模板的成员函数,但是不同的编译器对我可以做什么以及为什么有截然不同的看法。
让我们慢慢来,从适用于所有主要编译器(all = gcc、clang 和 msvc)的东西开始:
#include <concepts>
#include <type_traits>
template <class T>
concept Integer
= std::is_same_v<T,int> || std::is_same_v<T,unsigned int>;
template <class T>
concept FloatingPoint
= std::is_same_v<T,float> || std::is_same_v<T,double>;
template <class T>
struct Foo
{
T get() {return 0;}
};
template <Integer T>
struct Foo<T>
{
T get(){ return 0; }
};
template <FloatingPoint T>
struct Foo<T>
{
T get(){ return 0; }
};
int main()
{
Foo<char>().get();
Foo<int>().get();
Foo<float>().get();
}
Run Code Online (Sandbox Code Playgroud)
很酷,但我想将成员函数的声明和定义分开。让我们将定义移到专门的类之一 …
c++ partial-specialization visual-c++ language-lawyer c++-concepts
说我有这个代码:
#include <iostream>
#include <vector>
int main()
{
std::vector<int> vec {10, 15, 20};
auto itr = vec.begin();
vec.erase(itr);
for(const auto& element : vec)
{
std::cout << element << " ";
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
这给了我15 20
预期的效果.现在,cppreference说这约erase()
:
在擦除点或之后使迭代器和引用无效,包括end()迭代器
很公平,但这是标准给出的唯一保证vector::erase()
吗?
是否允许在擦除的迭代器之后重新排序它的元素?
例如,这些条件是否保证在擦除后保持,这意味着erase()
迭代器之后的所有元素都向左移1:
vec[0] == 15
vec[1] == 20
Run Code Online (Sandbox Code Playgroud)
或者允许实现在他们认为合适的情况下移动值,从而创建场景vec[0] == 20
等等?
我想引用标准的相关部分.
cppreference明确表示std::shared_future<T>::wait
从多个线程调用:
从多个线程在同一个 std::shared_future 上调用 wait 是不安全的;预期用途是等待相同共享状态的每个线程拥有 std::shared_future 的副本。
但我找不到这种说法的依据。标准标记中没有任何wait
特殊情况。虽然标准说单个shared_future
实例上的方法不同步,但你不需要同步,只要只调用 const 方法:
[17.6.5.9/3] C++ 标准库函数不应直接或间接修改当前线程以外的线程可访问的对象 (1.10),除非这些对象是通过函数的非常量参数直接或间接访问的,包括 this。
有矛盾的 答案上的SO被发现。有没有人有这方面的权威来源,可以解释如何const
在 stdlib 上调用方法会导致竞争条件?
我试图想出一个解决方案,从C函数中产生一个Luajit协程,它立即创建一个要在另一个OS线程上处理的tasklet.
根据Lua的各种文件,事情开始相互矛盾,这是不是完全有可能?文件不是很清楚,也没有解释推理.
Lua 5.1声明每个协程都有一个堆栈.但是,只有一个全局C堆栈.我不完全确定为什么这是一个障碍.
Lua 5.2显然用lua_pcallk和lua_yieldk修复了这个问题.但这些解释非常令人困惑.
但是这些都没有说明我正在使用的VM ......这是LuaJIT 2.0.4和LuaJIT 2.1.0.
谷歌搜索告诉我,Luajit 1.x已经实现了CoCo,显然每个lua线程(协同程序)都使用了真正的C堆栈.这允许从任何地方屈服.
只有一个搜索引导我看到显然LuaJIT 2.x没有实现coco,因为每个协程都使用C堆栈.
谁能告诉我从C产生协同程序的问题是什么?并验证我是否可以安全地从c产生/恢复luajit 2.x协同程序?
我目前正在使用随机发生器为我生成9位数字.我目前正在尝试在java中使用String.format来打印像XXX-XX-XXXX这样的随机数字,就像社会安全号码一样.我只是不能这样做,我不知道该怎么办.我正在使用模数,似乎我的填充关闭或我完全错了.问题是我必须使用模数.非常感谢任何帮助我指向正确方向的帮助,谢谢.我正在尝试修复ID.
public String toString (){
System.out.printf("%d\n",ID);
return String.format("First Name: %12s LastName %12s ID: %03d-%02d-%04d ", firstName, lastName,ID%1000,ID%10000, ID%000001000);
}
}
Run Code Online (Sandbox Code Playgroud) 考虑以下示例代码:
struct X { const int n; };
union U { X x; float f; };
void fun() {
U u = {{ 1 }};
u.f = 5.f; // OK, creates new subobject of 'u'
X *p = new (&u.x) X {2}; // OK, creates new subobject of 'u'
if(*std::launder(&u.x.n) == 2){// condition is true because of std::launder
std::cout << u.x.n << std::endl; //UB here?
}
}
Run Code Online (Sandbox Code Playgroud)
函数会fun
根据语言标准打印什么?换句话说,std::launder
last 的效果是否超出了它被调用的表达式?std::launder
或者,我们每次需要访问更新后的值时都必须使用u.x.n
?
标准提到f(a,(t = 3,t + 2),c); 根据我的理解,这将是赋值表达式,后跟第二个运算符的表达式.
但语法列出并列:
表达:
赋值表达式
表达式,赋值表达式
有人这么好,向我解释一下,我在这里错过了什么?
以下代码使用g ++版本5.1.0成功编译.注意在成员函数中catch
没有对应try
的foo::bar()
.我想知道这种语法是否合法,如果有,它有什么影响?
struct foo
{
void bar()
{
}
catch (...)
{
}
};
int main ()
{
foo f;
f.bar();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
问题的启发来自处理大型数据二进制文件
链接到对象
程序(1)创建一个内存映射文件并向其中写入一些对象(C++标准定义),关闭文件并退出。
程序(2)将上述文件映射到内存中并尝试通过reinterpret_cast
.
根据标准,这是否合法,因为对象表示没有更改并且对象仍然存在于文件中?
如果在两个进程之间尝试这样做,而不是使用文件,而是使用共享进程内存,这合法吗?
注意 - 这个问题与存储或共享本地虚拟地址无关,因为这显然是一件坏事。
考虑以下代码块:
void foo(){
int a = div(1,2);
}
Run Code Online (Sandbox Code Playgroud)
这通常不会编译,因为该div
函数尚未声明。但是,如果我在代码前面加上#include <map>
,代码就会编译。为什么要将map
标识符拉入全局命名空间,以及为什么div
特别使用该函数?有办法避免这种情况吗?
[麦克维]
#include <map>
void foo(){
int a = div(1,2);
}
int main()
{
foo();
}
Run Code Online (Sandbox Code Playgroud)
实时链接 - https://godbolt.org/z/Ye8rv4MTc
铿锵——<source>:4:7: error: no viable conversion from 'div_t' to 'int'
海湾合作委员会-<source>:4:11: error: 'div' was not declared in this scope
MSVC-<source>(4): error C2440: 'initializing': cannot convert from 'div_t' to 'int'
c++ ×9
c ×1
c++-concepts ×1
c++11 ×1
c++14 ×1
coroutine ×1
gcc ×1
java ×1
lua ×1
luajit ×1
sequencing ×1
stdlaunder ×1
vector ×1
visual-c++ ×1