我们没有'extern模板','模板'函数总是'隐式内联'.这还有意义吗?
首先,我认为不是.但是,我在调试模式下观察到了MSVC 10.0的这种行为.我正在使用一个自定义allocator类,它依赖于用户只传递在同一个实例上分配的指针deallocate.但是,在发布模式下,我的代码正在运行.
这是一个错误还是我弄错了?
为什么以下代码会产生编译器错误而没有命名模板make_static_vector?
template<class Tuple>
class vector;
template<typename T, std::size_t N>
using static_vector = vector<std::array<T, N>>;
template<class Tuple>
class vector
{
private:
using value_type = std::decay_t<decltype(std::declval<Tuple&>().operator[](0))>;
template<typename T, typename... Elements>
friend static_vector<T, sizeof...(Elements)> make_static_vector(Elements&&... elements) {
return { std::forward<Elements>(elements)... };
}
template<typename... Elements>
vector(Elements&&... elements)
: m_elements{ static_cast<value_type>(std::forward<Elements>(elements))... }
{ }
Tuple m_elements;
};
int main()
{
make_static_vector<double>(1, 1);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我已经创建了代码的现场演示.当我移动make_static_vector类外部的定义并且只在类中留下声明部分时,它正在工作.
为什么不能直接在类中定义函数?
foo每当有多个参数并且每个参数都可以转换为类型时,我想启用类的ctor value_type.我尝试过以下方法:
struct foo
{
using value_type = /* some type */;
template<class... Ts,
std::enable_if_t<(sizeof...(Ts) > 0) && std::conjunction_v<std::is_convertible_v<Ts, value_type>...>, int> = 0>
explicit foo(Ts&&... vs)
{
}
};
Run Code Online (Sandbox Code Playgroud)
假设foo::value_type = float.我试图声明foo bar{ 1 };并观察到ctor被禁用了.为了看看发生了什么,我std::conjunction_v从模板中删除了部分并添加了
static_assert(std::conjunction_v<std::is_convertible_v<Ts, value_type>...>, "");
Run Code Online (Sandbox Code Playgroud)
对身体.现在我的编译器(MSVC 14.1/Clang)产生错误
模板类型参数的模板参数必须是类型
在
static_assert(std::conjunction_v<std::is_convertible_v<Ts, value_type>...>, "");
// ^
Run Code Online (Sandbox Code Playgroud)
这究竟是什么问题?c
我有一个结构体和一个结构体foo bar,我想要一些成员字段的常量值,即struct foo { const char* s, ... };std::vector<foo> v;push_backfoos
bar.push_back({ "1", /*...*/ });
bar.push_back({ "2", /*...*/ });
bar.push_back({ "3", /*...*/ });
//...
Run Code Online (Sandbox Code Playgroud)
现在,如果我不是完全错了,这并不安全,因为字符串文字的生命周期受限于初始化大括号的范围。因此,字符串文字的生命周期"1"应该已经在第二行结束push_back。
我们该如何处理?我们真的需要创建第二个容器 strongstd::string并将相应的c_str()指针传递给bar吗?
我需要验证Web Storage API是否受支持并可用(由于安全问题,它可能已被禁用)。
因此,我认为检查是否定义了sessionStorage或localStorage类型就足够了:
if (typeof sessionStorage != 'undefined')
{
alert('sessionStorage available');
}
else
{
alert('sessionStorage not available');
}
Run Code Online (Sandbox Code Playgroud)
但是,我想知道这种类型是否可能存在,但无论如何我都无法使用Web Storage API。
备注:我知道,如果禁用cookie并访问sessionStorage或localStorage,Firefox将引发安全错误。
请考虑以下简单的代码片段:
template<typename T>
struct point2{ T x, y; };
template<typename T>
std::complex<T> foo(std::vector<point2<T>> const& x)
{
std::reduce(std::execution::par_unseq, x.begin(), x.end(), std::complex<T>{},
[&](std::complex<T> const& first, point2<T> const& second) {
return first + std::complex<T>{ second.x, second.y };
});
}
Run Code Online (Sandbox Code Playgroud)
使用 Visual Studio 2022(C++ 语言设置为 C++20)时,我收到错误消息
'int foo::<lambda_1>::operator ()(const std::complex &,const point2 &) const': 无法将参数 2 从 'std::complex' 转换为 'const point2 &'
这里出了什么问题?定义中的迭代器指向的类型似乎std::reduce需要与所选的初始值相同。但这似乎不是 C++ 标准中描述的要求。我错过了什么吗?
我需要计算D维函数的函数值和梯度并将这些值加在一起。D我认为简单地将梯度部分存储在第一个分量中并将函数值存储在D+1维向量的最后一个分量中将是有益于计算的。
但是,如何从该维向量中提取第一个D分量(即梯度部分) ?D+1我知道可以选择切片,但我不想在这里添加任何无意义的开销。所以,我尝试简单地reinterpret_cast<Eigen::Vector<T, D>&>在我的上做一个Eigen::Vector<T, D + 1>并且它起作用了;但这真的能保证有效(并且安全)吗?
c++ ×7
c++17 ×3
c++20 ×2
containers ×2
templates ×2
allocator ×1
c++14 ×1
eigen ×1
enable-if ×1
friend ×1
inline ×1
javascript ×1
reduce ×1
standards ×1
stl ×1
string ×1
type-traits ×1
web-storage ×1