问题描述
像这样有效的 C++20 代码吗?
function wrap_wp_get_attachment_image_with_picture_tag( $html,$attachment_id,$size,$icon,$attr ){
if ( is_admin() || $size == 'medium' || $size == 'thumbnail' ) return $html;
if ( $mobile_id = get_post_meta( $attachment_id,'_Meta_key_of_mobile_picuture_id',true ) ){
$mobile_srcset = wp_get_attachment_image_srcset( $mobile_id,'medium_large' );
$html = '<picture><source media="( max-width : 782px )" srcset="'.$mobile_srcset.'">'.$html.'</picture>';
}
return $html;
}
add_filter( 'wp_get_attachment_image','wrap_wp_get_attachment_image_with_picture_tag',10,5 );
改编自 vector-of-bool 博文。
使用最新版本的 gcc,代码可以运行 fine,但最新版本的 clang 给出了这个 error:
#include <iostream>
template <typename T>
concept impls_decrement = requires(T it) { it.decrement(); };
template <class Derived>
struct iterator_facade {
Derived& operator--()
requires impls_decrement<Derived>
{
auto& self = static_cast<Derived&>(*this);
self.decrement();
return self;
}
};
struct my_iterator : iterator_facade<my_iterator> {
void decrement() {
std::cout << "decrement" << std::endl;
}
};
int main() {
my_iterator iter;
--iter;
return 0;
}
哪个编译器是正确的?
解决方法
正如 Barry 提到的,代码是有效的,这是 Clang bug 44833。
与此同时,我可以通过编写这样的代码 (demo) 来解决这个问题:
#include <iostream>
template <typename T>
concept impls_decrement = requires(T it) { it.decrement(); };
template <class Derived>
struct iterator_facade {
template <class T=Derived>
requires impls_decrement<T>
Derived& operator--()
{
auto& self = static_cast<Derived&>(*this);
self.decrement();
return self;
}
};
struct my_iterator : iterator_facade<my_iterator> {
void decrement() {
std::cout << "decrement" << std::endl;
}
};
int main() {
my_iterator iter;
--iter;
return 0;
}