@@ -114,8 +114,8 @@ class cpp_function : public function {
114
114
// / Construct a cpp_function from a vanilla function pointer
115
115
template <typename Return, typename ... Args, typename ... Extra>
116
116
// NOLINTNEXTLINE(google-explicit-constructor)
117
- cpp_function (Return (*f)(Args...), const Extra &...extra ) {
118
- initialize (f, f, extra...);
117
+ cpp_function (Return (*f)(Args...), Extra & &...extra ) {
118
+ initialize (f, f, std::forward<Extra>( extra) ...);
119
119
}
120
120
121
121
// / Construct a cpp_function from a lambda function (possibly with internal state)
@@ -131,45 +131,45 @@ class cpp_function : public function {
131
131
// / Construct a cpp_function from a class method (non-const, no ref-qualifier)
132
132
template <typename Return, typename Class, typename ... Arg, typename ... Extra>
133
133
// NOLINTNEXTLINE(google-explicit-constructor)
134
- cpp_function (Return (Class::*f)(Arg...), const Extra &...extra ) {
134
+ cpp_function (Return (Class::*f)(Arg...), Extra & &...extra ) {
135
135
initialize (
136
136
[f](Class *c, Arg... args) -> Return { return (c->*f)(std::forward<Arg>(args)...); },
137
137
(Return (*)(Class *, Arg...)) nullptr ,
138
- extra...);
138
+ std::forward<Extra>( extra) ...);
139
139
}
140
140
141
141
// / Construct a cpp_function from a class method (non-const, lvalue ref-qualifier)
142
142
// / A copy of the overload for non-const functions without explicit ref-qualifier
143
143
// / but with an added `&`.
144
144
template <typename Return, typename Class, typename ... Arg, typename ... Extra>
145
145
// NOLINTNEXTLINE(google-explicit-constructor)
146
- cpp_function (Return (Class::*f)(Arg...) &, const Extra &...extra ) {
146
+ cpp_function (Return (Class::*f)(Arg...) &, Extra & &...extra ) {
147
147
initialize (
148
148
[f](Class *c, Arg... args) -> Return { return (c->*f)(std::forward<Arg>(args)...); },
149
149
(Return (*)(Class *, Arg...)) nullptr ,
150
- extra...);
150
+ std::forward<Extra>( extra) ...);
151
151
}
152
152
153
153
// / Construct a cpp_function from a class method (const, no ref-qualifier)
154
154
template <typename Return, typename Class, typename ... Arg, typename ... Extra>
155
155
// NOLINTNEXTLINE(google-explicit-constructor)
156
- cpp_function (Return (Class::*f)(Arg...) const , const Extra &...extra ) {
156
+ cpp_function (Return (Class::*f)(Arg...) const , Extra & &...extra ) {
157
157
initialize ([f](const Class *c,
158
158
Arg... args) -> Return { return (c->*f)(std::forward<Arg>(args)...); },
159
159
(Return (*)(const Class *, Arg...)) nullptr ,
160
- extra...);
160
+ std::forward<Extra>( extra) ...);
161
161
}
162
162
163
163
// / Construct a cpp_function from a class method (const, lvalue ref-qualifier)
164
164
// / A copy of the overload for const functions without explicit ref-qualifier
165
165
// / but with an added `&`.
166
166
template <typename Return, typename Class, typename ... Arg, typename ... Extra>
167
167
// NOLINTNEXTLINE(google-explicit-constructor)
168
- cpp_function (Return (Class::*f)(Arg...) const &, const Extra &...extra ) {
168
+ cpp_function (Return (Class::*f)(Arg...) const &, Extra & &...extra ) {
169
169
initialize ([f](const Class *c,
170
170
Arg... args) -> Return { return (c->*f)(std::forward<Arg>(args)...); },
171
171
(Return (*)(const Class *, Arg...)) nullptr ,
172
- extra...);
172
+ std::forward<Extra>( extra) ...);
173
173
}
174
174
175
175
// / Return the function name
@@ -1184,12 +1184,12 @@ class module_ : public object {
1184
1184
details on the ``Extra&& ... extra`` argument, see section :ref:`extras`.
1185
1185
\endrst */
1186
1186
template <typename Func, typename ... Extra>
1187
- module_ &def (const char *name_, Func &&f, const Extra &...extra) {
1187
+ module_ &def (const char *name_, Func &&f, Extra & &...extra) {
1188
1188
cpp_function func (std::forward<Func>(f),
1189
1189
name (name_),
1190
1190
scope (*this ),
1191
1191
sibling (getattr (*this , name_, none ())),
1192
- extra...);
1192
+ std::forward<Extra>( extra) ...);
1193
1193
// NB: allow overwriting here because cpp_function sets up a chain with the intention of
1194
1194
// overwriting (and has already checked internally that it isn't overwriting
1195
1195
// non-functions).
@@ -1572,7 +1572,7 @@ class class_ : public detail::generic_type {
1572
1572
PYBIND11_OBJECT (class_, generic_type, PyType_Check)
1573
1573
1574
1574
template <typename ... Extra>
1575
- class_ (handle scope, const char *name, const Extra &...extra) {
1575
+ class_ (handle scope, const char *name, Extra & &...extra) {
1576
1576
using namespace detail ;
1577
1577
1578
1578
// MI can only be specified via class_ template options, not constructor parameters
@@ -1601,7 +1601,7 @@ class class_ : public detail::generic_type {
1601
1601
PYBIND11_EXPAND_SIDE_EFFECTS (add_base<options>(record));
1602
1602
1603
1603
/* Process optional arguments, if any */
1604
- process_attributes<Extra...>::init (extra..., &record);
1604
+ process_attributes<Extra...>::init (std::forward<Extra>( extra) ..., &record);
1605
1605
1606
1606
generic_type::initialize (record);
1607
1607
@@ -1627,65 +1627,65 @@ class class_ : public detail::generic_type {
1627
1627
static void add_base (detail::type_record &) {}
1628
1628
1629
1629
template <typename Func, typename ... Extra>
1630
- class_ &def (const char *name_, Func &&f, const Extra &...extra) {
1630
+ class_ &def (const char *name_, Func &&f, Extra & &...extra) {
1631
1631
cpp_function cf (method_adaptor<type>(std::forward<Func>(f)),
1632
1632
name (name_),
1633
1633
is_method (*this ),
1634
1634
sibling (getattr (*this , name_, none ())),
1635
- extra...);
1635
+ std::forward<Extra>( extra) ...);
1636
1636
add_class_method (*this , name_, cf);
1637
1637
return *this ;
1638
1638
}
1639
1639
1640
1640
template <typename Func, typename ... Extra>
1641
- class_ &def_static (const char *name_, Func &&f, const Extra &...extra) {
1641
+ class_ &def_static (const char *name_, Func &&f, Extra & &...extra) {
1642
1642
static_assert (!std::is_member_function_pointer<Func>::value,
1643
1643
" def_static(...) called with a non-static member function pointer" );
1644
1644
cpp_function cf (std::forward<Func>(f),
1645
1645
name (name_),
1646
1646
scope (*this ),
1647
1647
sibling (getattr (*this , name_, none ())),
1648
- extra...);
1648
+ std::forward<Extra>( extra) ...);
1649
1649
auto cf_name = cf.name ();
1650
1650
attr (std::move (cf_name)) = staticmethod (std::move (cf));
1651
1651
return *this ;
1652
1652
}
1653
1653
1654
1654
template <typename T, typename ... Extra, detail::enable_if_t <T::op_enable_if_hook, int > = 0 >
1655
- class_ &def (const T &op, const Extra &...extra) {
1656
- op.execute (*this , extra...);
1655
+ class_ &def (const T &op, Extra & &...extra) {
1656
+ op.execute (*this , std::forward<Extra>( extra) ...);
1657
1657
return *this ;
1658
1658
}
1659
1659
1660
1660
template <typename T, typename ... Extra, detail::enable_if_t <T::op_enable_if_hook, int > = 0 >
1661
- class_ &def_cast (const T &op, const Extra &...extra) {
1662
- op.execute_cast (*this , extra...);
1661
+ class_ &def_cast (const T &op, Extra & &...extra) {
1662
+ op.execute_cast (*this , std::forward<Extra>( extra) ...);
1663
1663
return *this ;
1664
1664
}
1665
1665
1666
1666
template <typename ... Args, typename ... Extra>
1667
- class_ &def (const detail::initimpl::constructor<Args...> &init, const Extra &...extra) {
1667
+ class_ &def (const detail::initimpl::constructor<Args...> &init, Extra & &...extra) {
1668
1668
PYBIND11_WORKAROUND_INCORRECT_MSVC_C4100 (init);
1669
- init.execute (*this , extra...);
1669
+ init.execute (*this , std::forward<Extra>( extra) ...);
1670
1670
return *this ;
1671
1671
}
1672
1672
1673
1673
template <typename ... Args, typename ... Extra>
1674
- class_ &def (const detail::initimpl::alias_constructor<Args...> &init, const Extra &...extra) {
1674
+ class_ &def (const detail::initimpl::alias_constructor<Args...> &init, Extra & &...extra) {
1675
1675
PYBIND11_WORKAROUND_INCORRECT_MSVC_C4100 (init);
1676
- init.execute (*this , extra...);
1676
+ init.execute (*this , std::forward<Extra>( extra) ...);
1677
1677
return *this ;
1678
1678
}
1679
1679
1680
1680
template <typename ... Args, typename ... Extra>
1681
- class_ &def (detail::initimpl::factory<Args...> &&init, const Extra &...extra) {
1682
- std::move (init).execute (*this , extra...);
1681
+ class_ &def (detail::initimpl::factory<Args...> &&init, Extra & &...extra) {
1682
+ std::move (init).execute (*this , std::forward<Extra>( extra) ...);
1683
1683
return *this ;
1684
1684
}
1685
1685
1686
1686
template <typename ... Args, typename ... Extra>
1687
- class_ &def (detail::initimpl::pickle_factory<Args...> &&pf, const Extra &...extra) {
1688
- std::move (pf).execute (*this , extra...);
1687
+ class_ &def (detail::initimpl::pickle_factory<Args...> &&pf, Extra & &...extra) {
1688
+ std::move (pf).execute (*this , std::forward<Extra>( extra) ...);
1689
1689
return *this ;
1690
1690
}
1691
1691
@@ -1723,115 +1723,115 @@ class class_ : public detail::generic_type {
1723
1723
}
1724
1724
1725
1725
template <typename C, typename D, typename ... Extra>
1726
- class_ &def_readwrite (const char *name, D C::*pm, const Extra &...extra) {
1726
+ class_ &def_readwrite (const char *name, D C::*pm, Extra & &...extra) {
1727
1727
static_assert (std::is_same<C, type>::value || std::is_base_of<C, type>::value,
1728
1728
" def_readwrite() requires a class member (or base class member)" );
1729
1729
cpp_function fget ([pm](const type &c) -> const D & { return c.*pm; }, is_method (*this )),
1730
1730
fset ([pm](type &c, const D &value) { c.*pm = value; }, is_method (*this ));
1731
- def_property (name, fget, fset, return_value_policy::reference_internal, extra...);
1731
+ def_property (name, fget, fset, return_value_policy::reference_internal, std::forward<Extra>( extra) ...);
1732
1732
return *this ;
1733
1733
}
1734
1734
1735
1735
template <typename C, typename D, typename ... Extra>
1736
- class_ &def_readonly (const char *name, const D C::*pm, const Extra &...extra) {
1736
+ class_ &def_readonly (const char *name, const D C::*pm, Extra & &...extra) {
1737
1737
static_assert (std::is_same<C, type>::value || std::is_base_of<C, type>::value,
1738
1738
" def_readonly() requires a class member (or base class member)" );
1739
1739
cpp_function fget ([pm](const type &c) -> const D & { return c.*pm; }, is_method (*this ));
1740
- def_property_readonly (name, fget, return_value_policy::reference_internal, extra...);
1740
+ def_property_readonly (name, fget, return_value_policy::reference_internal, std::forward<Extra>( extra) ...);
1741
1741
return *this ;
1742
1742
}
1743
1743
1744
1744
template <typename D, typename ... Extra>
1745
- class_ &def_readwrite_static (const char *name, D *pm, const Extra &...extra) {
1745
+ class_ &def_readwrite_static (const char *name, D *pm, Extra & &...extra) {
1746
1746
cpp_function fget ([pm](const object &) -> const D & { return *pm; }, scope (*this )),
1747
1747
fset ([pm](const object &, const D &value) { *pm = value; }, scope (*this ));
1748
- def_property_static (name, fget, fset, return_value_policy::reference, extra...);
1748
+ def_property_static (name, fget, fset, return_value_policy::reference, std::forward<Extra>( extra) ...);
1749
1749
return *this ;
1750
1750
}
1751
1751
1752
1752
template <typename D, typename ... Extra>
1753
- class_ &def_readonly_static (const char *name, const D *pm, const Extra &...extra) {
1753
+ class_ &def_readonly_static (const char *name, const D *pm, Extra & &...extra) {
1754
1754
cpp_function fget ([pm](const object &) -> const D & { return *pm; }, scope (*this ));
1755
- def_property_readonly_static (name, fget, return_value_policy::reference, extra...);
1755
+ def_property_readonly_static (name, fget, return_value_policy::reference, std::forward<Extra>( extra) ...);
1756
1756
return *this ;
1757
1757
}
1758
1758
1759
1759
// / Uses return_value_policy::reference_internal by default
1760
1760
template <typename Getter, typename ... Extra>
1761
- class_ &def_property_readonly (const char *name, const Getter &fget, const Extra &...extra) {
1761
+ class_ &def_property_readonly (const char *name, const Getter &fget, Extra & &...extra) {
1762
1762
return def_property_readonly (name,
1763
1763
cpp_function (method_adaptor<type>(fget)),
1764
1764
return_value_policy::reference_internal,
1765
- extra...);
1765
+ std::forward<Extra>( extra) ...);
1766
1766
}
1767
1767
1768
1768
// / Uses cpp_function's return_value_policy by default
1769
1769
template <typename ... Extra>
1770
1770
class_ &
1771
- def_property_readonly (const char *name, const cpp_function &fget, const Extra &...extra) {
1772
- return def_property (name, fget, nullptr , extra...);
1771
+ def_property_readonly (const char *name, const cpp_function &fget, Extra & &...extra) {
1772
+ return def_property (name, fget, nullptr , std::forward<Extra>( extra) ...);
1773
1773
}
1774
1774
1775
1775
// / Uses return_value_policy::reference by default
1776
1776
template <typename Getter, typename ... Extra>
1777
1777
class_ &
1778
- def_property_readonly_static (const char *name, const Getter &fget, const Extra &...extra) {
1778
+ def_property_readonly_static (const char *name, const Getter &fget, Extra & &...extra) {
1779
1779
return def_property_readonly_static (
1780
- name, cpp_function (fget), return_value_policy::reference, extra...);
1780
+ name, cpp_function (fget), return_value_policy::reference, std::forward<Extra>( extra) ...);
1781
1781
}
1782
1782
1783
1783
// / Uses cpp_function's return_value_policy by default
1784
1784
template <typename ... Extra>
1785
1785
class_ &def_property_readonly_static (const char *name,
1786
1786
const cpp_function &fget,
1787
- const Extra &...extra) {
1788
- return def_property_static (name, fget, nullptr , extra...);
1787
+ Extra & &...extra) {
1788
+ return def_property_static (name, fget, nullptr , std::forward<Extra>( extra) ...);
1789
1789
}
1790
1790
1791
1791
// / Uses return_value_policy::reference_internal by default
1792
1792
template <typename Getter, typename Setter, typename ... Extra>
1793
1793
class_ &
1794
- def_property (const char *name, const Getter &fget, const Setter &fset, const Extra &...extra) {
1794
+ def_property (const char *name, const Getter &fget, const Setter &fset, Extra & &...extra) {
1795
1795
return def_property (
1796
- name, fget, cpp_function (method_adaptor<type>(fset), is_setter ()), extra...);
1796
+ name, fget, cpp_function (method_adaptor<type>(fset), is_setter ()), std::forward<Extra>( extra) ...);
1797
1797
}
1798
1798
template <typename Getter, typename ... Extra>
1799
1799
class_ &def_property (const char *name,
1800
1800
const Getter &fget,
1801
1801
const cpp_function &fset,
1802
- const Extra &...extra) {
1802
+ Extra & &...extra) {
1803
1803
return def_property (name,
1804
1804
cpp_function (method_adaptor<type>(fget)),
1805
1805
fset,
1806
1806
return_value_policy::reference_internal,
1807
- extra...);
1807
+ std::forward<Extra>( extra) ...);
1808
1808
}
1809
1809
1810
1810
// / Uses cpp_function's return_value_policy by default
1811
1811
template <typename ... Extra>
1812
1812
class_ &def_property (const char *name,
1813
1813
const cpp_function &fget,
1814
1814
const cpp_function &fset,
1815
- const Extra &...extra) {
1816
- return def_property_static (name, fget, fset, is_method (*this ), extra...);
1815
+ Extra & &...extra) {
1816
+ return def_property_static (name, fget, fset, is_method (*this ), std::forward<Extra>( extra) ...);
1817
1817
}
1818
1818
1819
1819
// / Uses return_value_policy::reference by default
1820
1820
template <typename Getter, typename ... Extra>
1821
1821
class_ &def_property_static (const char *name,
1822
1822
const Getter &fget,
1823
1823
const cpp_function &fset,
1824
- const Extra &...extra) {
1824
+ Extra & &...extra) {
1825
1825
return def_property_static (
1826
- name, cpp_function (fget), fset, return_value_policy::reference, extra...);
1826
+ name, cpp_function (fget), fset, return_value_policy::reference, std::forward<Extra>( extra) ...);
1827
1827
}
1828
1828
1829
1829
// / Uses cpp_function's return_value_policy by default
1830
1830
template <typename ... Extra>
1831
1831
class_ &def_property_static (const char *name,
1832
1832
const cpp_function &fget,
1833
1833
const cpp_function &fset,
1834
- const Extra &...extra) {
1834
+ Extra & &...extra) {
1835
1835
static_assert (0 == detail::constexpr_sum (std::is_base_of<arg, Extra>::value...),
1836
1836
" Argument annotations are not allowed for properties" );
1837
1837
auto rec_fget = get_function_record (fget), rec_fset = get_function_record (fset);
@@ -2238,8 +2238,8 @@ class enum_ : public class_<Type> {
2238
2238
Underlying>;
2239
2239
2240
2240
template <typename ... Extra>
2241
- enum_ (const handle &scope, const char *name, const Extra &...extra)
2242
- : class_<Type>(scope, name, extra...), m_base(*this , scope) {
2241
+ enum_ (const handle &scope, const char *name, Extra & &...extra)
2242
+ : class_<Type>(scope, name, std::forward<Extra>( extra) ...), m_base(*this , scope) {
2243
2243
constexpr bool is_arithmetic = detail::any_of<std::is_same<arithmetic, Extra>...>::value;
2244
2244
constexpr bool is_convertible = std::is_convertible<Type, Underlying>::value;
2245
2245
m_base.init (is_arithmetic, is_convertible);
0 commit comments